Sql-Server
使用 SQLcmd 將參數傳遞給過程
我使用這個SQL 命令:
sqlcmd -v first_date="30/09/2015" last_date="15/09/2016"
我想將該參數傳遞給儲存過程:
ALTER PROCEDURE [dbo].[_testProcedure] WITH EXECUTE AS CALLER AS BEGIN DECLARE @F_FIRST_DATE_DT VARCHAR(50) DECLARE @F_LAST_DATE_DT VARCHAR(50) SET @F_FIRST_DATE_DT = N'$(first_date)' SET @F_LAST_DATE_DT = N'$(last_date)'
但它給我一個錯誤:
“first_date”附近的語法不正確
將變數傳遞給儲存過程的正確方法是什麼?
沒有特殊的方法可以將 SQLCMD 變數傳遞給儲存過程。儲存過程是封裝的程式碼,不能像您在問題中發布的程式碼中嘗試那樣傳遞 SQLCMD 變數。
儲存過程採用輸入參數來傳遞值。並且這些輸入參數應該是傳入數據的正確數據類型;您不需要
VARCHAR
僅僅因為 SQLCMD 變數沒有指定它們的類型而接受日期值。CREATE PROCEDURE [dbo].[_testProcedure] WITH EXECUTE AS CALLER ( @FirstDate DATETIME, @LastDate DATETIME ) AS SET NOCOUNT ON; SELECT DATEDIFF(DAY, @FirstDate, @LastDate) AS [NumberOfDays];
然後您可以通過以下方式之一呼叫它:
EXEC [dbo].[_testProcedure] first_date, last_date;
EXEC [dbo].[_testProcedure] @FirstDate = first_date, @LastDate = last_date;
現在,如果您正在從 SQLCMD 執行上述 T-SQL,那麼您可以將 SQLCMD 變數傳遞給該T-SQL,即目前查詢:
-Q "EXEC [dbo].[_testProcedure] $(first_date), $(last_date);"
要麼:
-Q "EXEC [dbo].[_testProcedure] @FirstDate = $(first_date), @LastDate = $(last_date);"
此外,您需要使用單引號而不是雙引號傳入 SQLCMD 變數值。請嘗試以下操作以了解原因:
SQLCMD -Q "PRINT $(FirstDate);" -v FirstDate='12/05/2006'
回報:
12/05/2006
但:
SQLCMD -Q "PRINT $(FirstDate);" -v FirstDate="12/05/2006"
回報:
0
我從命令行得到了這兩個範例:
sqlcmd -S .\sql2014 -E -Q "EXEC tempdb.[dbo].[_testProcedure] $(first_date), $(last_date)" -v first_date = '30/09/2015' last_date = '31/12/2015' GO sqlcmd -S .\sql2014 -E -i "d:\temp\temp.sql" -v first_date = '30/09/2015' last_date = '31/12/2015'
如果您使用 -Q 開關來傳遞查詢,只需將變數作為 SQL 字元串的一部分。如果您正在呼叫腳本,則腳本應包含變數,例如在我的範例 temp.sql 中包含以下 SQL:
EXEC tempdb.[dbo].[_testProcedure] $(first_date), $(last_date)
高溫高壓