私はこれを使用します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変数にcannotを渡すことができます。
ストアドプロシージャは、入力パラメーターを受け取って値を渡します。そして、これらの入力パラメーターは、渡されるデータの正しいデータ型でなければなりません。 SQLCMD変数は型を指定しないので、日付値としてVARCHAR
を受け入れる必要はありません。
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変数をthat 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
コマンドラインからこれらの2つの例が機能するようにしました。
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)
HTH