2017-02-19 9 views
1

返される別のselectステートメントにselectステートメントを実行し、返された変数の1つを使用しようとしています。 = 413selectステートメントで使用する検索から変数を返す

enter image description here

FIELD_IDに基づいて

クエリ検索私はITEM_IDことを持っているすべての行6を取得するクエリで使用することができるように6が返さ必要があります。ここで

は私が持っているものです。

DECLARE @Results TABLE(result sysname); 
INSERT @Results(result); 
DECLARE @SQL4 NVARCHAR(MAX) = 'Select DISTINCT ITEM_ID, ATRR_VAL from [dbo].[CONTRACT_ATTR] WHERE [ATTR_VAL] LIKE ''%@VALUE%'' AND FIELD_ID = 413 ORDER BY [ATTR_VAL]'; 
SET @SQL4 = replace(@SQL4, '@VALUE', '123456'); 
EXEC SP_executesql @SQL4; 
SELECT * FR0M @Results 

これはオンラインチュートリアルに従うことをしようとしていても、私は複数のエラーを取得しています。私は間違って何をしているのですか?どうすれば修正できますか?

編集:私は近づいています:

declare @myTable table 
(
    ITEM_ID nvarchar(256), 
    ATTR_VAL nvarchar(256) 
) 

insert into @myTable 
    exec (N'Select ITEM_ID, ATTR_VAL from [dbo].[CONTRACT_ATTR] WHERE [ATTR_VAL] LIKE ''%123%'' AND FIELD_ID = 413 ORDER BY [ATTR_VAL]') --dynamic query 

select * from @myTable 
+0

'INSERT'文は不完全です。どのデータをテーブル変数に挿入しようとしていますか? –

+0

@GiorgosBetsos私は(ITEM_ID、ATRR_VAL)を挿入しようとしています。 –

+0

それはできません。 '@ Results'テーブルには1つのカラムしかありません。そしてなぜ、 'nvarchar'の代わりに' sysname'を使うのですか? –

答えて

3

このようなことをしようとしていますか?

field_id 413用@valueようattr_valを持ってitemためのすべての行を選択します。

select ca.* 
    from dbo.contract_attr as ca 
    where exists (
    select 1 
    from dbo.contract_attr as i 
    where i.field_id = 413 
     and i.attr_val like '%'[email protected]+'%' 
     and i.item_id = ca.item_id 
    ) 

あなたが意識していません念のために:大手ワイルドカードと

検索条件は、インデックス・スキャンが発生します索引シークの代わりに(これは同等の作業をしていない限り、ほとんどの場合遅くなります)。これは非SARGableと呼ばれます。 SARGableはSearch ARGument Ableの略です。

like @value+'%'を使用して変更できる場合はSARGableになり、その列に存在するインデックスを利用してインデックスシークを実行できます。

1

コードにはいくつかの問題がありますが転記:

  • INSERTステートメントは、動的SQLの部分に含まれるべきです。
  • 動的SQL文のスコープ内で表変数を使用することはできません。
  • @Resultsテーブルは、挿入しようとしているデータを保持するのに十分な大きさではありません。

代わりに一時表を使用できます。次のコードを試してください:

CREATE TABLE #Results TABLE(ID int, result nvarchar(128) NOT NULL); 

DECLARE @SQL4 NVARCHAR(MAX) = 'INSERT INTO #Results(ID, result) 
           Select DISTINCT ITEM_ID, ATRR_VAL 
           from [dbo].[CONTRACT_ATTR] 
           WHERE [ATTR_VAL] LIKE ''%@VALUE%'' AND 
            FIELD_ID = 413'; 
SET @SQL4 = replace(@SQL4, '@VALUE', '123456'); 
EXEC SP_executesql @SQL4; 
SELECT * FR0M #Results ORDER BY [result]; 
関連する問題