IN子句不接受SQL 2008中的动态传递值

IN子句不接受SQL 2008中的动态传递值,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,下面是传递和设置动态值的SQL过程 代码:SQL过程名称:GetArchivedData ALTER PROCEDURE [dbo].[GetArchivedData](@PublicationURL varchar(100),@Number int,@Action varchar(max)) AS DECLARE @TEST Varchar(max) IF (@Action = 'ALL') BEGIN SET @TEST = '''ADD'''+','+'''UPD'''+

下面是传递和设置动态值的SQL过程

代码:SQL过程名称:GetArchivedData

      ALTER PROCEDURE [dbo].[GetArchivedData](@PublicationURL varchar(100),@Number int,@Action varchar(max))  

AS
DECLARE @TEST Varchar(max)
IF (@Action = 'ALL')
BEGIN
SET @TEST = '''ADD'''+','+'''UPD'''+','+'''DEL''';
END
ELSE 
BEGIN
SET @TEST = @Action
END
IF (@Number !=0)
BEGIN
PRINT 'Inside'+ @TEST 
     BEGIN TRANSACTION TRAN1 

           SELECT 
              1 AS Tag,  
              NULL AS Parent,  
              NULL AS [root!1!],  
              NULL AS [Item!2!Id],  
              NULL AS [Item!2!Action],  
              NULL AS [Item!2!Publication_Id],  
              NULL AS [Item!2!Item_Reference_Id],  
              NULL AS [Item!2!Item_type],  
              convert( datetime, '9999-01-01' ) AS [Item!2!Last_Published_Date],  
              NULL AS [Item!2!Url],  
              NULL AS [Item!2!Schema_Id]  

              UNION  

              SELECT TOP (@Number) 
              2,  
              1,  
              '1',  
              T.ID,  
              T.ACTION,  
              T.PUBLICATION_ID,  
              T.ITEM_REFERENCE_ID,  
              T.ITEM_TYPE,  
              T.LAST_PUBLISHED_DATE,  
              T.URL,  
              T.SCHEMA_ID    
              FROM DBO.AUTN_ITEMS T WHERE FLAG=1 AND ACTION IN (@TEST) AND URL LIKE @PublicationURL+'%' 
              ORDER BY [Item!2!Last_Published_Date] DESC
              FOR XML EXPLICIT                

     COMMIT TRANSACTION TRAN1   
END
ELSE IF (@Number = 0)
BEGIN
PRINT 'Outside'+ @TEST 
     BEGIN TRANSACTION TRAN2

           SELECT 
              1 AS Tag,  
              NULL AS Parent,  
              NULL AS [root!1!],  
              NULL AS [Item!2!Id],  
              NULL AS [Item!2!Action],  
              NULL AS [Item!2!Publication_Id],  
              NULL AS [Item!2!Item_Reference_Id],  
              NULL AS [Item!2!Item_type],  
              convert( datetime, '9999-01-01' ) AS [Item!2!Last_Published_Date],  
              NULL AS [Item!2!Url],  
              NULL AS [Item!2!Schema_Id]  

              UNION  

              SELECT  
              2,  
              1,  
              '1',  
              T.ID,  
              T.ACTION,  
              T.PUBLICATION_ID,  
              T.ITEM_REFERENCE_ID,  
              T.ITEM_TYPE,  
              T.LAST_PUBLISHED_DATE,  
              T.URL,  
              T.SCHEMA_ID    
              FROM DBO.AUTN_ITEMS T WHERE FLAG=1 AND  ACTION IN (@TEST) AND URL LIKE @PublicationURL+'%' 
              ORDER BY [Item!2!Last_Published_Date] DESC
              FOR XML EXPLICIT   

     COMMIT TRANSACTION TRAN2 
END
RETURN  
执行SQL过程:

DECLARE @return_value int

EXEC    @return_value = [dbo].[GetArchivedData]
        @PublicationURL = N'/in',
        @Number = 0,
        @Action = N'ALL'

SELECT  'Return Value' = @return_value
如果我在过程中打印它,我可以看到值被正确设置,但是有一个值工作得很好,但是当我设置
set@TEST=''ADD'+'、'+''UPD'+'、'+''DEL''时不返回任何结果


请建议

使用Table变量而不是@Test作为如下字符串

DECLARE  @ActionTbl table ([Action] varchar(3))
IF (@Action = 'ALL')
BEGIN
    INSERT INTO @ActionTbl SELECT 'Add' AS ID
    UNION ALL
    SELECT 'UPD' AS ID
    UNION ALL   
    SELECT 'DEL' ID 
END
ELSE
BEGIN 
    INSERT INTO @ActionTbl VALUES(@Action)
END
并在查询中使用

ACTION IN (Select Action from @ActionTbl)
而不是

ACTION IN (@TEST)

首先,这里的主要问题是,您不能在
中使用
在另一个字符串中搜索一个字符串<使用
中的code>搜索值行集合中的值。另外,@TEST字符串值是
'ADD、'UPD'、'DEL'
(每个项目都有配额)。我猜
Action
字段包含没有配额的值,因此除了其他答案之外,还有一种方法:

替换

ACTION IN (@TEST)


传递xml并使用.nodes或使用dynamic或使用table函数将列表转换为列表中值的记录集。@Revoua,我不理解您的建议,请澄清更多我们是否需要在处理后删除@ActionTbl表?不,您不需要删除@ActionTbl,因为它与任何其他变量一样是一个表变量。
  @TEST LIKE '%'''+ACTION+'''%'