从搜索返回变量以在 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_val
的 item
的所有行,例如 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,并且它可以利用该列上存在的索引来执行索引查找。
我正在尝试执行 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_val
的 item
的所有行,例如 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,并且它可以利用该列上存在的索引来执行索引查找。