0
我正在编写脚本以在当前模式表示法未知的数据库中生成存储过程(认为共享主机)。SQL Server 2012动态SQL - 存储过程 - 获取语法错误
我已经决定在存储过程中使用动态SQL,以便Web应用程序可以将基于用户定义的设置的数据库架构传递给SQL Server以便正确触发。
当我开始编写存储过程时,我注意到动态SQL打开了一个通常不会有的SQL注入问题,所以我重新编写了程序来解决这个问题。然而即使SQL使我能够运行该脚本生成存储过程,每次我尝试运行测试存储过程,我得到一个语法错误附近的关键字
不正确的语法“WHERE”
我相信这是与模式的参数有关,但我为什么这不起作用而感到不知所措?我为模式输入值dbo
。
/*
Name : usp_GetTestTicker
Description : returns test ticker
*/
if not exists (select * from dbo.sysobjects
where id = object_id(N'usp_GetTestTicker')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
BEGIN
DECLARE @sql as nvarchar(150)
SET @sql = 'CREATE procedure usp_GetTestTicker AS'
EXEC(@sql)
END
GO
ALTER PROCEDURE usp_GetTestTicker
@schema VARCHAR(25),
@TickerItemId INT
AS
SET NOCOUNT ON
BEGIN
DECLARE @sql_cmd NVARCHAR(MAX)
DECLARE @sql_params NVARCHAR(MAX)
SET @sql_cmd = N'SELECT * FROM @schema.TickerItem WHERE TickerItemId = @TickerItemId'
SET @sql_params = N'@schema VARCHAR(25), @TickerItemId INT'
EXEC sp_executesql @sql_cmd, @sql_params, @schema, @TickerItemId
END
GO
如果你改变你的EXEC命令这个'EXEC sp_executesql的@stmt = @sql_cmd,@params = @sql_params,@schema = @schema,@TickerItemId = @TickerItemId;' – DVT
不能传递模式作为参数。你必须建立字符串。 – Jeremy
杰里米有理由。考虑一下,如果你直接编写了像SELECT * From @ schema.MyTable这样的SELECT语句会发生什么。它不起作用,因为你不能有一个变量作为模式标识符。 –