sql >> Database >  >> RDS >> Sqlserver

Variabele declareren voor een queryreeks

Het is mogelijk, maar het vereist het gebruik van dynamische SQL.
Ik raad aan om De vloek en zegeningen van dynamische SQL alvorens verder te gaan...

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)

Dynamische SQL is slechts een SQL-instructie, samengesteld als een tekenreeks voordat deze wordt uitgevoerd. Dus de gebruikelijke string-aaneenschakeling vindt plaats. Dynamische SQL is vereist wanneer u iets wilt doen in de SQL-syntaxis dat niet is toegestaan, zoals:

  • een enkele parameter om een ​​door komma's gescheiden lijst met waarden voor een IN-clausule weer te geven
  • een variabele die zowel de waarde als de SQL-syntaxis vertegenwoordigt (IE:het voorbeeld dat je hebt gegeven)

EXEC sp_executesql stelt u in staat om bind/preparedstatement-parameters te gebruiken, zodat u zich geen zorgen hoeft te maken over het ontsnappen van enkele aanhalingstekens/enz. ​​voor SQL-injectieaanvallen.



  1. Import dump met SQLFILE-parameter die de gegevens in de tabel niet retourneert

  2. Wat is de opslaggrootte van BIT(1)?

  3. BULK-insert met FIRE_TRIGGERS voert de trigger niet uit

  4. PostgreSQL:42883 Operator bestaat niet:tijdstempel zonder tijdzone =tekst