Sql-Server

使用 SQLcmd 將參數傳遞給過程

  • October 14, 2019

我使用這個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)

高溫高壓

引用自:https://dba.stackexchange.com/questions/106850