SQL Server-基于表中的记录构造动态where子句
我有一个名为dbo.ItemTagTransactions的表,如下所示:SQL Server-基于表中的记录构造动态where子句,sql,sql-server,tsql,select,where,Sql,Sql Server,Tsql,Select,Where,我有一个名为dbo.ItemTagTransactions的表,如下所示: PK_ID | ItemTag 1 | Filename.xlsx 2 | ABC7798 3 | {empty string} 4 | Completed SELECT FK_QueueItem_ItemTagTransaction FROM dbo.ItemTagTransactions WHERE TagValue = {insert dynamic where clause
PK_ID | ItemTag
1 | Filename.xlsx
2 | ABC7798
3 | {empty string}
4 | Completed
SELECT FK_QueueItem_ItemTagTransaction
FROM dbo.ItemTagTransactions
WHERE TagValue = {insert dynamic where clause here}
如何基于上表中ItemTag列中的值构造动态WHERE子句?此表可能有一条或多条记录
我将使用的查询如下所示:
PK_ID | ItemTag
1 | Filename.xlsx
2 | ABC7798
3 | {empty string}
4 | Completed
SELECT FK_QueueItem_ItemTagTransaction
FROM dbo.ItemTagTransactions
WHERE TagValue = {insert dynamic where clause here}
WHERE子句中的字段总是引用TagValue,它可以是1或更多。它基于由分号分隔的字符串,如下所示。Filename.xlsx;ABC7798;;完成
预期结果如下:
SELECT FK_QueueItem_ItemTagTransaction
FROM dbo.ItemTagTransactions
WHERE TagValue = 'Filename.xlsx'
OR TagValue = 'ABC7798'
OR TagValue = ''
OR TagValue = 'Completed'
另外,我将在存储过程中使用它尝试使用动态Sql。多个标记值必须用倒逗号分隔,如下图所示的InputString
declare @dynamicsql nvarchar(max),@inputstring nvarchar(max)='''ABC101170'',''dfg101264'''
select @dynamicsql='select * from table
where tagvalue in('+@inputstring+')'
print @dynamicsql
exec sp_executesql @dynamicsql
如果您的输入是分号分隔的,您只需将这些分号替换为“”,并用“”将其环绕,即可形成有效的值列表:
DECLARE @sampleInput NVARCHAR(MAX) = 'Filename.xlsx;ABC7798;;Completed'
DECLARE @Query NVARCHAR(MAX)
SET @Query = 'SELECT FK_QueueItem_ItemTagTransaction FROM dbo.ItemTagTransactions WHERE TagValue IN ('
+ CONCAT('N''', REPLACE(@sampleInput, ';', ''',N'''), '''')
+ ')'
PRINT @Query
它将输出:
SELECT FK_QueueItem_ItemTagTransaction FROM dbo.ItemTagTransactions WHERE TagValue IN (N'Filename.xlsx',N'ABC7798',N'',N'Completed')
如果要执行查询并存储结果以供进一步处理,请创建临时表:
CREATE TABLE #results
(
FK_QueueItem_ItemTagTransaction INT -- adjust the
);
INSERT INTO #results
EXEC sp_executesql @Query
如果您有一个返回表的字符串拆分函数,那么就更容易了,只需使用
SELECT FK_QueueItem_ItemTagTransaction
INTO #results -- for further processing
FROM dbo.ItemTagTransactions
WHERE TagValue IN (SELECT Value
FROM dbo.mySplitStringFunction(@sampleInput))
我希望这对你有用
SELECT FK_QueueItem_ItemTagTransaction
FROM dbo.ItemTagTransactions
WHERE TagValue IN (SELECT ItemTag FROM dbo.ItemTagTransactions)
试试这个…你可以使用
返回:
看看这是怎么回事
你可以传递一个字符串,然后
CREATE PROCEDURE MyProc
@AVariable VARCHAR(300)
AS
SELECT *
FROM T CROSS APPLY
(SELECT Value FROM STRING_SPLIT(@AVariable, ',')) TT --You can use semi-colon ; instead of ,
WHERE T.ItemTag = TT.Value;
但是使用表值参数更安全,因为字符串可能包含,。你在说什么?因为您使用的是存储过程,所以只需将@Variable传递给proc,其中TagValue=@VariableSample数据最好作为+。请将您的问题包括在内,您当前的尝试和您想要的结果。关于更多细节,您只需要在[split my;delimited string]中使用where TagValue这样的where子句。因此,如果您在SQL.Tables中使用google拆分分隔字符串,它非常适合与in子句一起使用。其中tagValue位于“从中选择值”SplitStringTable@thecodeexplorer-你真是太好了:但是马辛吉也给出了这个答案,所以给他吧。