1: 通常のSQL文はexecで実行可能です
テーブル名から*を選択してください exec('select * from tableName') exec sp_executesql N'select * from tableName' -- 文字列の前にNを加える必要があることに注意してください
2: フィールド名、テーブル名、データベース名などを変数として使用する場合、動的SQLを使用しなければなりません
ヴァルチャー@fname宣言(20) set @fname = 'FiledName' tableName -- Errorから@fnameを選択してください。エラーは出ませんが、結果は固定値のFiledNameになってしまい、これは望んでいるものではありません。 exec('select ' + @fname + ' from tableName') -- プラス記号の前後に単一引用符の横にスペースが追加されていることに注意してください
もちろん、文字列を変数の形に変えることもできます ヴァルチャー@fname宣言(20) set @fname = 'FiledName' -- フィールド名を設定する
ヴァルハル@s宣言(1000) set @s = 'select ' + ' @fname + ' from tableName' exec(@s) -- 成功 exec sp_executesql @s -- この文は誤りを報告します
@s Nvarchar(1000)と宣言してください ― ここでnvarchar(1000)に変更されていることに注意してください。 set @s = 'select ' + ' @fname + ' from tableName' exec(@s) -- 成功 エグゼクティブsp_executesql @s――この文は正しいです
3. 出力パラメータ Declare @num int, @sqls Nvarchar(4000) set @sqls='table Nameからcount(*) を選択' エグゼクティブ(@sqls)
--執行執行の結果を変数にどうやって入力すればいいですか?
Declare @num int, @sqls Nvarchar(4000) set @sqls='select @a=count(*) from tableName ' exec sp_executesql @sqls,N'@a int output',@num output 選択@num
1: 通常のSQL文はExecで実行可能例:tableNameから*を選択する Exec('select * from tableName') Exec sp_executesql N'select * from tableName' -- 文字列の前にNを加える必要があることに注意してください
2: フィールド名、テーブル名、データベース名などを変数として使用する場合、動的SQLを使用しなければなりません
エラー:ヴァルチャー@fname宣言(20) set @fname = 'FiledName' tableName -- Errorから@fnameを選択してください。エラーは出ませんが、結果は固定値のFiledNameになってしまい、これは望んでいるものではありません。 正解:Exec('select ' + @fname + ' from tableName') -- 単一引用符の前後にスペースが追加されているのに注目してください
もちろん、文字列を変数の形に変えることもできます ヴァルチャー@fname宣言(20) set @fname = 'FiledName' -- フィールド名を設定する
ヴァルハル@s宣言(1000) set @s = 'select ' + ' @fname + ' from tableName' エグゼクティブ(@s)――成功 exec sp_executesql @s -- この文は誤りを報告します
--注:パラメータ@s ntext、nchar、nvarchar型でなければならず、varchar(1000)を宣言@s nvarchar(1000)@s宣言に変更する必要があります。
以下は以下の通りです。 @s Nvarchar(1000)と宣言してください ― ここでnvarchar(1000)に変更されていることに注意してください。
set @fname = 'FiledName' -- フィールド名を設定する set @s = 'select ' + ' @fname + ' from tableName' エグゼクティブ(@s)――成功 エグゼクティブsp_executesql @s――この文は正しいです
3. 入力または出力パラメータ
(1) 入力パラメータ: @QueryString nvarchar(1000) -- 動的クエリ文変数(注:ntextまたはnchar nvarchar型でなければならず、varchar型ではない) nvarchar(200) @paramstring宣言 - 動的文のパラメータ列を設定する(注:ntextまたはnchar nvarchar型でなければならず、varchar型ではない) Declare @input_id int - 動的文に渡すパラメータの値を定義します
set @QueryString='select * from tablename (id=@id' -idはフィールド名、@idは渡すパラメータです set @paramstring='@id int' -- 動的文のパラメータを定義する文字列を設定します。 Set @input_id =1 -- 動的文で渡されるパラメータの値を1に設定します exec sp_executesql @querystring,@paramstring,@id=@input_id 複数のパラメータがある場合: @QueryString nvarchar(1000) -- 動的クエリ文変数(注:ntextまたはnchar nvarchar型でなければならず、varchar型ではない) nvarchar(200) @paramstring宣言 - 動的文のパラメータ列を設定する(注:ntextまたはnchar nvarchar型でなければならず、varchar型ではない) Declare @input_id int - 動的文に渡すパラメータの値、パラメータ1を定義します Declare @input_name varchar(20) - 動的文に渡す引数の値を定義します。パラメータ2
Set @QueryString='Select* from tablename (id=@id および name=@name' -id と name はフィールド名、@id と @name は渡すパラメータです Set @paramstring='@id int,@name varchar(20)' -- 動的文のパラメータ定義の文字列を「」で区切って設定します。 Set @input_id =1 -- 動的文で渡されるパラメータの値を1に設定します set @input_name='Zhang San' --動的文で渡すパラメータの値を「Zhang San」に設定します。 exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- 引数の順序に注目 (2) 出力パラメータ Declare @num int, @sqls Nvarchar(4000) set @sqls='table Nameからcount(*) を選択' エグゼクティブ(@sqls) --執行執行の結果を変数にどうやって入力すればいいですか? 宣言 @QueryString nvarchar(1000) -- 動的クエリ名変数(注:ntext または nchar nvarchar タイプでなければならず、varchar タイプではありません) nvarchar(200) @paramstring宣言 - 動的文のパラメータ列を設定する(注:ntextまたはnchar nvarchar型でなければならず、varchar型ではない) int @output_result 宣言 - クエリ結果が@output_resultに割り当てられます
Set @QueryString='select @totalcount=count(*) from tablename' --@totalcount は出力パラメータです Set @paramstring='@totalcount int output' -動的文のパラメータで定義された文字列を「」で区切って設定します。 exec sp_executesql @querystring,@paramstring,@totalcount=@output_result 出力 セレクト@output_result もちろん、入力パラメータと出力パラメータは一緒に使うこともできるので、自分で試してみることもできます。 さらに、動的文クエリの結果セットを出力したい場合は、一時テーブルを使う次の方法を思い浮かべますが、他に良い方法があるかはわかりません。 もし object_id('[tempdb].[ dbo].#tmp')はnullではありません -- 一時テーブル #tmp 存在するか確認し、存在する場合は削除してください ドロップテーブル #tmp tablenameから*を #tmp に選択し、1=2の場合 -- tablenameと同じ構造で一時テーブル #tmp を作成します
宣言 @QueryString nvarchar(1000) -- 動的クエリ名変数(注:ntext または nchar nvarchar タイプでなければならず、varchar タイプではありません) set @QueryString='テーブル名から* 選択 ' #tmp(field1, field2,...) exec(@querystirng)に挿入 |