2017-02-19 24 views
1

我正在嘗試執行select語句,並將返回的其他變量用作返回的另一個select語句。從搜索中返回變量以便在select語句中使用

基礎上,FIELD_ID查詢搜索= 413

enter image description here

我需要6返回,以便它可以在查詢中用來獲得具有ITEM_ID行的所有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'表只有一列。順便說一句,爲什麼使用'sysname'而不是'nvarchar'? –

回答

3

你想要做這樣的事嗎?

選擇所有行一個item有一個attr_val@valuefield_id 413:萬一

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];