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語句會發生什麼。它不起作用,因爲你不能有一個變量作爲模式標識符。 –