1. ホーム
  2. sql

[解決済み] クエリ文字列の変数を宣言する

2023-01-16 12:12:45

質問

私は、MS SQL Server 2005 でこれを行う方法があるかどうか疑問に思っていました。

  DECLARE @theDate varchar(60)
  SET @theDate = '''2010-01-01'' AND ''2010-08-31 23:59:59'''

  SELECT    AdministratorCode, 
            SUM(Total) as theTotal, 
            SUM(WOD.Quantity) as theQty, 
            AVG(Total) as avgTotal, 
            (SELECT SUM(tblWOD.Amount)
                FROM tblWOD
                JOIN tblWO on tblWOD.OrderID = tblWO.ID
                WHERE tblWO.Approved = '1' 
                AND tblWO.AdministratorCode = tblWO.AdministratorCode
                AND tblWO.OrderDate BETWEEN @theDate
            )
 ... etc

これは可能なのでしょうか?

どのように解決するのですか?

可能ですが、動的SQLを使用する必要があります。

を読むことをお勧めします。 動的SQLの呪いと恵み を読んでからにしましょう。

DECLARE @theDate varchar(60)
SET @theDate = '''2010-01-01'' AND ''2010-08-31 23:59:59'''

DECLARE @SQL VARCHAR(MAX)  
SET @SQL = 'SELECT AdministratorCode, 
                   SUM(Total) as theTotal, 
                   SUM(WOD.Quantity) as theQty, 
                   AVG(Total) as avgTotal, 
                  (SELECT SUM(tblWOD.Amount)
                     FROM tblWOD
                     JOIN tblWO on tblWOD.OrderID = tblWO.ID
                    WHERE tblWO.Approved = ''1''
                      AND tblWO.AdministratorCode = tblWO.AdministratorCode
                      AND tblWO.OrderDate BETWEEN '+ @theDate +')'

EXEC(@SQL)

ダイナミック SQL は単なる SQL 文で、実行される前に文字列として構成されます。 ですから、通常の文字列の連結が行われます。 動的SQLは、SQL構文で許可されていないことを行いたいときはいつでも必要です。

  • IN 節のカンマ区切りの値のリストを表す単一のパラメータ
  • 値と SQL 構文の両方を表す変数 (IE: あなたが提供した例)

EXEC sp_executesql を使用すると、bind/preparedstatement パラメータを使用できるようになり、SQL インジェクション攻撃のためにシングルクォートなどのエスケープを気にする必要がなくなります。