1: Sıradan SQL ifadeleri exec ile çalıştırılabilir
* from tableName seç exec('tableName'den * seç') exec sp_executesql N'select * from tableName' -- Diziden önce N eklemeniz gerektiğini unutmayın
2: Değişken olarak alan isimleri, tablo isimleri, veritabanı adları vb. kullanılırken, dinamik SQL kullanılmalıdır
@fname varchar ilan edecek(20) set @fname = 'FiledName' TableName üzerinden @fname seçin -- Hata, hata sorulmaz, ancak sonuç sabit bir değer FiledName olur, bu istediğiniz şey değildir. exec('select' + @fname + ' from tableName') -- artı işaretinden önce ve sonra tek tırnak işaretinin yanına bir boşluk eklendiğini not edin
Tabii ki, diziyi değişken biçimine de dönüştürebilirsiniz @fname varchar ilan edecek(20) set @fname = 'FiledName' --Alan adını ayar
declare @s varchar(1000) @s = tableName'den 'seç' + @fname + ' ayarla' exec(@s) -- başarı yönetici sp_executesql @s -- Bu cümle bir hata bildirecek
@s Nvarchar(1000) ilan edin -- burada bunun nvarchar(1000) olarak değiştirildiğini unutmayın. @s = tableName'den 'seç' + @fname + ' ayarla' exec(@s) -- başarı Yönetici sp_executesql @s -- bu cümle doğru
3. Çıkış parametreleri declare @num int, @sqls nvarchar(4000) @sqls='tableName'den count(*) seç' yönetici(@sqls)
--Yönetici yürütme sonucunu bir değişkene nasıl koyabilirim?
declare @num int, @sqls nvarchar(4000) @sqls='tableName 'dan @a=count(*) seç ' exec sp_executesql @sqls,N'@a int output'@num çıktı Select @num
1: Sıradan SQL ifadeleri Exec ile çalıştırılabilir Örnek: TableName üzerinden * seç Exec('tableName'den * seç') Exec sp_executesql N'select * from tableName' -- Diziden önce N eklemeniz gerektiğini unutmayın
2: Değişken olarak alan isimleri, tablo isimleri, veritabanı adları vb. kullanılırken, dinamik SQL kullanılmalıdır
Hata: @fname varchar(20) ilan edecek set @fname = 'FiledName' TableName üzerinden @fname seçin -- Hata, hata sorulmaz, ancak sonuç sabit bir değer FiledName olur, bu istediğiniz şey değildir. Doğru: Exec('select ' + @fname + ' from tableName') -- tek tırnak yerine plus işaretinden önce ve sonra bir boşluk eklendiğini fark edin
Tabii ki, diziyi değişken biçimine de dönüştürebilirsiniz @fname varchar ilan edecek(20) set @fname = 'FiledName' --Alan adını ayar
declare @s varchar(1000) @s = tableName'den 'seç' + @fname + ' ayarla' Yönetici(@s) -- Başarı yönetici sp_executesql @s -- Bu cümle bir hata bildirecek
--Not: @s parametre ntext veya nchar veya nvarchar tipinde olmalı, declare @s varchar(1000) değiştirilmeli, @s nvarchar(1000) dekare edilmeli
Şöyle: @s Nvarchar(1000) ilan edin -- burada bunun nvarchar(1000) olarak değiştirildiğini unutmayın.
set @fname = 'FiledName' --Alan adını ayar @s = tableName'den 'seç' + @fname + ' ayarla' Yönetici(@s) -- Başarı Yönetici sp_executesql @s -- bu cümle doğru
3. Giriş veya çıkış parametreleri
(1) Giriş parametreleri: Declare @QueryString nvarchar(1000) -- dinamik sorgu ifadesi değişkeni (not: ntext veya nchar nvarchar tipi olmalıdır, varchar tipi değil) Declare @paramstring nvarchar(200) - Dinamik ifadede parametre dizesini ayarlayın (not: ntext veya nchar nvarchar tipi olmalıdır, varchar tipi değil) declare @input_id int - dinamik ifadeye iledilecek parametrelerin değerini tanımlar
@QueryString='Tablo adından * seç burada id=@id' --id alan adıdır, @id iletilecek parametredir küme @paramstring='@id int' -- Dinamik ifadedeki parametreleri tanımlayan diziyi ayarlar @input_id =1 -- Dinamik ifadede iledilecek parametrenin değerini 1 olarak ayarlayın exec sp_executesql @querystring,@paramstring,@id=@input_id Birden fazla parametre varsa: Declare @QueryString nvarchar(1000) -- dinamik sorgu ifadesi değişkeni (not: ntext veya nchar nvarchar tipi olmalıdır, varchar tipi değil) Declare @paramstring nvarchar(200) - Dinamik ifadede parametre dizesini ayarlayın (not: ntext veya nchar nvarchar tipi olmalıdır, varchar tipi değil) declare @input_id int - Dinamik ifadeye iledilecek parametrenin değerini tanımlar, parametre 1 declare @input_name varchar(20) - dinamik ifadeye iledilecek argümanın değerini tanımlar, parametre 2
@QueryString='Table Name'den Select* ayarlayın; burada id=@id ve name=@name' --id ve name alan adlarıdır ve @id ile @name iletilecek parametrelerdir küme @paramstring='@id int,@name varchar(20)' -- Dinamik ifadedeki parametrelerin tanımının dizisini "," ile ayrılarak ayarlayın. @input_id =1 -- Dinamik ifadede iledilecek parametrenin değerini 1 olarak ayarlayın @input_name='Zhang San' --Dinamik ifadede iledilecek parametrenin değerini 'Zhang San' olarak ayarlayın exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Argümanların sırasına dikkat edin (2) Çıkış parametreleri declare @num int, @sqls nvarchar(4000) @sqls='tableName'den count(*) seç' yönetici(@sqls) --Yönetici yürütme sonucunu bir değişkene nasıl koyabilirim? declare @QueryString nvarchar(1000) -- dinamik sorgu adı değişkeni (Not: ntext veya nchar nvarchar tipi olmalıdır, varchar tipi değil) Declare @paramstring nvarchar(200) - Dinamik ifadede parametre dizesini ayarlayın (not: ntext veya nchar nvarchar tipi olmalıdır, varchar tipi değil) declare @output_result int - sorgu sonucu @output_result
@QueryString='tablonameden @totalcount=count(*)' ayarı --@totalcount çıktı parametresidir @paramstring='@totalcount int çıktı' --Dinamik ifadedeki parametrelerle tanımlanan diziyi "," ile ayırarak ayarlayın. exec sp_executesql @querystring,@paramstring,@totalcount=@output_result çıktı Select @output_result Tabii ki, giriş ve çıkış parametreleri birlikte kullanılabilir, böylece kendiniz deneyebilirsiniz. Ayrıca, dinamik ifade sorgusunun sonuç kümesini çıkarmak istiyorsanız, sadece geçici tablolar kullanma yöntemini düşünüyorum, daha iyi bir yolun var mı bilmiyorum. IF object_id('[tempdb].[ dbo].#tmp') NULL DEĞILDIR -- Geçici tablo #tmp var mı olduğunu belirleyin, varsa silin Bırak masa #tmp * seçin * içine #tmp Tablename ile 1=2 -- Tablename ile aynı yapıya sahip geçici bir tablo #tmp oluşturun
declare @QueryString nvarchar(1000) -- dinamik sorgu adı değişkeni (Not: ntext veya nchar nvarchar tipi olmalıdır, varchar tipi değil) @QueryString='Tabloname'den Seç * ' #tmp(field1,field2,...) exec(@querystirng) içine ekleyin |