从搜索返回变量以在 select 语句中使用

Returning variables from search to use in select statement

我正在尝试执行 select 语句,并将返回的变量之一用于将返回的另一个 select 语句。

查询根据field_id = 413进行搜索。

我需要返回 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

发布的代码存在几个问题:

  • INSERT 语句应包含在动态 sql 部分中。
  • 您不能在动态 sql 语句的范围内使用 table 变量。
  • @Results table 无论如何都不够大,无法容纳您要插入的数据。

您可以改用临时 table。试试下面的代码:

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

你想做这样的事情吗?

Select 具有 attr_valitem 的所有行,例如 field_id@value 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  '%'+@value+'%'
      and i.item_id = ca.item_id
    )

以防万一你不知道:

带有前导通配符的搜索条件将导致索引扫描而不是索引查找(这几乎总是较慢,除非它们正在做同等的工作)。这称为non-SARGable。 SARGable 是 Search ARGument Able 的缩写。

如果您可以更改为使用 like @value+'%',它将变为 SARGable,并且它可以利用该列上存在的索引来执行索引查找。