IN子句不接受SQL 2008中的动态传递值
下面是传递和设置动态值的SQL过程 代码:SQL过程名称:GetArchivedDataIN子句不接受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'''+
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+'''%'