SQL Server-基于表中的记录构造动态where子句

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

我有一个名为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 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-你真是太好了:但是马辛吉也给出了这个答案,所以给他吧。