1: Zwykłe instrukcje SQL mogą być wykonywane za pomocą exec
Wybierz * z tabeli Nazwa exec('select * from tableName') exec sp_executesql N'select * from tableName' -- Należy zauważyć, że musisz dodać N przed ciągiem
2: Przy użyciu nazw pól, tabel, nazw baz danych itp. jako zmiennych, należy stosować dynamiczne SQL
Deklaruj @fname varchar(20) set @fname = 'FiledName' Wybierz @fname z tableName – Błąd, nie pojawia się żaden błąd, ale wynik to stała wartość FiledName, co nie jest tym, czego chcesz. exec('select ' + @fname + ' z tableName') -- zwróć uwagę, że do boku pojedynczego cudzysłowu dodaje się spację przed i za znakiem plus
Oczywiście możesz też zmienić łańcuch na postać zmiennej Deklaruj @fname varchar(20) ustaw @fname = 'FiledName' --Ustaw nazwę pola
Deklaruj @s Varchara (1000) zestaw @s = 'wybierz ' + @fname + ' z tableName' exec(@s) -- sukces wykonawczy sp_executesql @s -- To zdanie zgłosi błąd
deklaruj @s Nvarchar(1000) — zauważ, że tutaj zmieniono to na nvarchar(1000). zestaw @s = 'wybierz ' + @fname + ' z tableName' exec(@s) -- sukces Wykonawczy sp_executesql @s -- to zdanie jest poprawne
3. Parametry wyjściowe deklaruj @num int, @sqls Nvarchar (4000) ustaw @sqls='wybierz count(*) z tableName' exec(@sqls)
--jak umieścić wynik wykonania exec w zmiennej?
deklaruj @num int, @sqls Nvarchar (4000) ustaw @sqls='wybierz @a=count(*) z tableName ' exec sp_executesql @sqls,N'@a int output',@num output Wybierz @num
1: Zwykłe instrukcje SQL mogą być wykonywane za pomocą Exec Example: Wybierz * z tableName Exec('select * from tableName') Exec sp_executesql N'select * from tableName' -- Należy dodać N przed ciągiem
2: Przy użyciu nazw pól, tabel, nazw baz danych itp. jako zmiennych, należy stosować dynamiczne SQL
Błąd: deklaruj @fname varchar(20) set @fname = 'FiledName' Wybierz @fname z tableName – Błąd, nie pojawia się żaden błąd, ale wynik to stała wartość FiledName, co nie jest tym, czego chcesz. Poprawnie: Exec('select ' + @fname + ' from tableName') -- zwróć uwagę na dodanie spacji obok pojedynczego cudzysłowu przed i po znaku plus
Oczywiście możesz też zmienić łańcuch na postać zmiennej Deklaruj @fname varchar(20) ustaw @fname = 'FiledName' --Ustaw nazwę pola
Deklaruj @s Varchara (1000) zestaw @s = 'wybierz ' + @fname + ' z tableName' Wykonawczy(@s) -- Sukces wykonawczy sp_executesql @s -- To zdanie zgłosi błąd
--Uwaga: @s parametr musi mieć ntext, nchar lub nvarchar, deklaruj @s varchar(1000) musi zostać zmieniony na deklarować @s nvarchar(1000)
Jak poniżej: deklaruj @s Nvarchar(1000) — zauważ, że tutaj zmieniono to na nvarchar(1000).
ustaw @fname = 'FiledName' --Ustaw nazwę pola zestaw @s = 'wybierz ' + @fname + ' z tableName' Wykonawczy(@s) -- Sukces Wykonawczy sp_executesql @s -- to zdanie jest poprawne
3. Parametry wejściowe lub wyjściowe
(1) Parametry wejściowe: declare @QueryString nvarchar(1000) -- zmienna dynamicznego zapytania (uwaga: musi być ntext lub nchar nvarchar type, nie varchar) Declare @paramstring nvarchar(200) - ustaw ciąg parametrów w instrukcji dynamicznej (uwaga: musi być ntext lub nchar typu nvarchar, nie varchar) declare @input_id int - definiuje wartość parametrów, które mają być przekazane do instrukcji dynamicznej
ustaw @QueryString='wybierz * z nazwy tabeli, gdzie id=@id' --id to nazwa pola, @id jest parametrem do przekazania set @paramstring='@id int' -- Ustawia ciąg definiujący parametry w instrukcji dynamicznej ustaw @input_id =1 -- Ustaw wartość parametru, który ma być przekazywany w instrukcji dynamicznej, na 1 egzex sp_executesql @querystring,@paramstring,@id=@input_id Jeśli jest wiele parametrów: declare @QueryString nvarchar(1000) -- zmienna dynamicznego zapytania (uwaga: musi być ntext lub nchar nvarchar type, nie varchar) Declare @paramstring nvarchar(200) - ustaw ciąg parametrów w instrukcji dynamicznej (uwaga: musi być ntext lub nchar typu nvarchar, nie varchar) declare @input_id int - definiuje wartość parametru, który ma być przekazany do dynamicznego potwierdzenia, parametr 1 declare @input_name varchar(20) - definiuje wartość argumentu, który ma być przekazany do dynamicznego zatwierdzenia, parametr 2
ustaw @QueryString='wybierz * z nazwy tabeli, gdzie id=@id i nazwa=@name' --id i nazwa to nazwy pól, a @id i @name to parametry do przekazania ustaw @paramstring='@id int,@name varchar(20)' -- Ustaw ciąg definicji parametrów w instrukcji dynamicznej, oddzielony przez "," ustaw @input_id =1 -- Ustaw wartość parametru, który ma być przekazywany w instrukcji dynamicznej, na 1 ustaw @input_name='Zhang San' --Ustaw wartość parametru, który ma być przekazany w instrukcji dynamicznej na 'Zhang San' exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Zwróć uwagę na kolejność argumentów (2) Parametry wyjściowe deklaruj @num int, @sqls Nvarchar (4000) ustaw @sqls='wybierz count(*) z tableName' exec(@sqls) --jak umieścić wynik wykonania exec w zmiennej? declare @QueryString nvarchar(1000) -- dynamiczna zmienna nazwy zapytania (Uwaga: musi być ntext lub nchar nvarchar, nie varchar) Declare @paramstring nvarchar(200) - ustaw ciąg parametrów w instrukcji dynamicznej (uwaga: musi być ntext lub nchar typu nvarchar, nie varchar) deklaruj @output_result int – wynik zapytania jest przypisany do @output_result
ustaw @QueryString='wybierz @totalcount=count(*) z nazwy tabeli' --@totalcount jest parametrem wyjściowym ustaw @paramstring='@totalcount int output' --Ustaw ciąg zdefiniowany przez parametry w instrukcji dynamicznej, oddzielony przez "," wynik sp_executesql @querystring, @paramstring, @totalcount=@output_result wyjście Wybierz @output_result Oczywiście parametry wejściowe i wyjściowe można używać razem, więc możesz wypróbować sam. Dodatkowo, jeśli chcesz wypisać zestaw wyników zapytania o polecenie dynamiczne, myślę tylko o następującej metodzie używania tabel tymczasowych, nie wiem, czy masz lepszy sposób. JEŚLI object_id('[tempdb].[ dbo].#tmp') NIE JEST NULL -- Sprawdź, czy tymczasowa tabela #tmp istnieje, a jeśli tak, usuń ją Drop table #tmp wybierz * do #tmp z nazwy tabeli, gdzie 1=2 — Stwórz tymczasową tabelę #tmp o tej samej strukturze co nazwa tabeli
declare @QueryString nvarchar(1000) -- dynamiczna zmienna nazwy zapytania (Uwaga: musi być ntext lub nchar nvarchar, nie varchar) ustaw @QueryString='wybierz * z nazwy tabeli ' wstaw do #tmp(field1,field2,...) exec(@querystirng) |