将变量从搜索返回到select语句中使用

时间:2017-02-19 18:59:22

标签: sql sql-server dynamic-sql

我正在尝试执行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

2 个答案:

答案 0 :(得分:3)

你想做这样的事吗?

选择func checkIfFileExist() { let s3 = AWSS3.defaultS3() let headObjectsRequest = AWSS3HeadObjectRequest() headObjectsRequest.bucket = "YourBucketName" //Don't add "/" at end of your bucket Name headObjectsRequest.key = "YourFileNameYouWantToCheckFor" //Don't add "/" in start of file name s3.headObject(headObjectsRequest).continueWithBlock { (task) -> AnyObject! in if let error = task.error { print("Error to find file: \(error)") } else { print("fileExist") } } } 的{​​{1}}的所有行,item attr_val@value 413:

field_id

万一你不知道:

使用前导通配符的搜索条件将导致索引扫描而不是索引搜索(几乎总是较慢,除非它们正在执行相同的工作)。这被称为非SARGable。 SARGable是Search ARGument Able的简称。

如果您可以更改为使用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 '%'+@value+'%' and i.item_id = ca.item_id ) ,它将变为SARGable,并且可以利用该列上存在的索引来执行索引搜索。

答案 1 :(得分: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];