Saya bertanya-tanya apakah ada cara untuk melakukan ini di 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
Apakah ini mungkin dilakukan?
sql
sql-server
sql-server-2005
tsql
dynamic-sql
StealthRT
sumber
sumber
Jawaban:
Itu mungkin, tetapi membutuhkan penggunaan SQL dinamis.
Saya merekomendasikan membaca Kutukan dan berkah SQL dinamis sebelum melanjutkan ...
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 Dinamis hanyalah pernyataan SQL, disusun sebagai string sebelum dieksekusi. Jadi penggabungan string biasa terjadi. SQL dinamis diperlukan setiap kali Anda ingin melakukan sesuatu dalam sintaks SQL yang tidak diizinkan, seperti:
EXEC sp_executesql
memungkinkan Anda untuk menggunakan parameter bind / preparedstatement sehingga Anda tidak perlu repot keluar dari tanda kutip tunggal / etc untuk serangan injeksi SQL.sumber
DECLARE @theDate DATETIME SET @theDate = '2010-01-01'
Kemudian ubah kueri Anda untuk menggunakan logika ini:
sumber
Menggunakan EXEC
Anda dapat menggunakan contoh berikut untuk membuat pernyataan SQL.
DECLARE @sqlCommand varchar(1000) DECLARE @columnList varchar(75) DECLARE @city varchar(75) SET @columnList = 'CustomerID, ContactName, City' SET @city = '''London''' SET @sqlCommand = 'SELECT ' + @columnList + ' FROM customers WHERE City = ' + @city EXEC (@sqlCommand)
Menggunakan sp_executesql
Dengan menggunakan pendekatan ini, Anda dapat memastikan bahwa nilai data yang diteruskan ke dalam kueri adalah tipe data yang benar dan menghindari penggunaan lebih banyak tanda kutip.
DECLARE @sqlCommand nvarchar(1000) DECLARE @columnList varchar(75) DECLARE @city varchar(75) SET @columnList = 'CustomerID, ContactName, City' SET @city = 'London' SET @sqlCommand = 'SELECT ' + @columnList + ' FROM customers WHERE City = @city' EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75)', @city = @city
Referensi
sumber
Saya akan menunjukkan bahwa dalam artikel yang ditautkan dalam jawaban teratas The Curse and Blessings of Dynamic SQL , penulis menyatakan bahwa jawabannya adalah tidak menggunakan SQL dinamis. Gulir hampir sampai akhir untuk melihat ini.
Dari artikel: "Metode yang benar adalah membongkar daftar ke dalam tabel dengan fungsi yang ditentukan pengguna atau prosedur tersimpan."
Tentu saja, setelah daftar ada di tabel, Anda dapat menggunakan gabungan. Saya tidak bisa berkomentar langsung pada jawaban teratas, jadi saya hanya menambahkan komentar ini.
sumber