2016-08-24 24 views
1

一度指定された変数を後でスクリプトで使用するにはどうすればよいですか?これらの変数は、クエリ内で複数回、スクリプト内で複数のクエリで使用できます。以下の例では、このような変数として@xを使用しています。上記のエラーを返しますSQLクエリに変数を追加する

Declare @Query nvarchar(1000) 
Declare @x nvarchar(40) 

Set @x = 'test' 
Set @Query = 'Select [Name] 
        , ' + @x + ' as [TestCase] 
       From mytable' 

Exec (@Query) 

-- returns "Invalid column name 'test'" 

:私は何をしたいか

のようなものです。私も次は、最初のように動作し、同じエラーを返していないことに注意

Declare @Query nvarchar(1000) 
Declare @x nvarchar(40) 

Set @x = 'test' 
Set @Query = 'Select [Name] 
        , ''test'' as [TestCase] 
       From mytable' 

Exec (@Query) 

-- Returns e.g. 
-- Name TestCase 
-- Alice Test 
-- Bob Test 

:私はそれが相当を達成したいと思います

エラーに基づいて
Declare @Query nvarchar(1000) 
Declare @x nvarchar(40) 

Set @x = 'test' 
Set @Query = 'Select [Name] 
        , ' + 'test' + ' as [TestCase] 
       From mytable' 

Exec (@Query) 

-- returns "Invalid column name 'test'" 

とI以来、列名として@xを使用しようとしていませんが、変数として、変数の無効な実装を使用していると仮定します。

答えて

2

から あなたが列名として変数を使用しようとしていないので、そうしないと動的SQLを使用する必要があります。 (どちらの動的SQLのみによるそれは素晴らしい攻撃面であることに注意多大して使用する必要がありますので、グッド・シング(TM)である。)

シンプル:

declare @x nvarchar(40) 

set @x = 'test' 

select [Name], @x as TestCase 
from mytable 

を行います。

言われていること

、あなたは(再びここで問題になっている特定のクエリではないが、おそらく、アドホッククエリがプロシージャに渡されているん)、動的SQLのためのユースケースを持っている場合、実行することあなたの変数をsp_executesql経由でクエリのパラメータとして渡すことになります。これは、パラメータを含むストアドプロシージャの作成に似ています。

declare @x nvarchar(40) 
declare @query nvarchar(1000) 

set @x = 'test' 

set @query = 'select [Name], @x as TestCase from mytable' 

exec sp_executesql @query, N'@x nvarchar(1000)', @x 
+0

ああ優秀、ありがとう!これは必要に応じて機能しました。 – conor

+0

私の質問に最も徹底的に回答し、簡素化するので、この答えを受け入れる - 私は実際にはこの場合動的SQLを必要としない。 – conor

+2

私はそれが助けてうれしいです。あなたの質問の後半に答えるには、自分で 'select @ query'を試して、どのクエリが構成されているのかを調べることができます。 '' [名前]を選択してください... 'と表示されます。これは "test"を列名として扱います。他の答えが示すように、引用符で囲む必要があります。しかし、次に、「@ x'が引用符で囲まれているとどうなるか」の問題を紹介し、動的SQLの危険性を実証します。例えば、 'set @x = 'test' '、名前、名前、名前、' 'hahaha''を他の回答のクエリで試してみてください! –

1
Declare @Query nvarchar(1000) 
Declare @x nvarchar(40) 

Set @x = 'test' 
Set @Query = 'Select [Name],'++''''[email protected]+''''+ ' as [TestCase] 
       From mytable' 

print @query 

出力:
を選択し、[名前]、 '試験' [テストケース] mytableは

+0

これはうまくいきましたが、余分な '+'とシングルクォートが何をするのか分かりません。あなたは説明を加えてください。 – conor

+0

@conor:try this..select ''、 '' '' '' – TheGameiswar

2

引用符がありませんでした。それでおしまい。以下のコードを試してください。

Declare @Query nvarchar(1000) 
    Declare @x nvarchar(40) 

    Set @x = 'test' 
    Set @Query = 'Select [Name] 
         , ''' + @x + ''' as [TestCase] 
        From mytable' 

    Exec (@Query) 
+0

ありがとう@Ranjana。なぜこれを取り巻く3つの一重引用符が必要ですか?私は二人がエスケープとして行動するのを知っていますが、三人が何をするのかは分かりません – conor

+0

シンプルなアイデアは、作成した選択クエリが存在しないため、エラーをスローするため、testという名前の列を検索します。これは列の値なので、 'test'として渡す必要があります。 '' 'で1つの引用符が生成されるので' '' + @ x + '' 'は' test 'になります。あなたの質問では '+ @ x +' - > testのようになります。 testは列名ではないのでエラーが発生する –

関連する問題