web-dev-qa-db-ja.com

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」付近の構文が正しくありません

変数をストアドプロシージャに渡すの正しい方法は何ですか?

3
rzry1911

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
3
Solomon Rutzky

コマンドラインからこれらの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

2
wBob