【问题标题】:Stored procedure passing guids as CSV string将 guid 作为 CSV 字符串传递的存储过程
【发布时间】:2012-06-16 22:58:24
【问题描述】:

存储过程的调用

exec spBatchRequestsForRescreening @GuidList='''A2C4B17A-57A7-49A9-97A0-0000070D92F3'',''945FA383-17D4-4CCB-B8FD-00000A40E2DC'''

失败 "从字符串转换为唯一标识符时转换失败。"

存储过程

ALTER PROC [dbo].[spBatchRequestsForRescreening] (@GuidList varchar(8000) )
AS BEGIN
    select *
    from DeniedPartyTransactions.dbo.DpsRequest
    with (nolock)
    where C1_PK in ( @GuidList )
END

下面的声明有效。有没有办法用单引号对 Guid 的 CSV 进行宏替换。

select * from DpsRequest
where c1_PK in ( 'A2C4B17A-57A7-49A9-97A0-0000070D92F3','945FA383-17D4-4CCB-B8FD-00000A40E2DC' ) 

更新:

下面确实有效。也许还有更好的?

ALTER PROC [dbo].[spBatchRequestsForRescreening] (@GuidList varchar(7000) )
AS BEGIN
    DECLARE @SQL varchar(8000)
    SET @SQL = 
    'select *
    from DeniedPartyTransactions.dbo.DpsRequest
    with (nolock)
    where C1_PK in (' +  @GuidList + ')' ;
    EXEC(@SQL)    
END

【问题讨论】:

    标签: sql-server-2008 tsql stored-procedures


    【解决方案1】:

    创建拆分函数:

    CREATE FUNCTION dbo.SplitGUIDs(@List NVARCHAR(MAX))
    RETURNS TABLE
    AS
       RETURN ( SELECT Item = CONVERT(UNIQUEIDENTIFIER, Item) FROM
           ( SELECT Item = x.i.value('(./text())[1]', 'nvarchar(max)')
             FROM ( SELECT [XML] = CONVERT(XML, '<i>'
             + REPLACE(@List, ',', '</i><i>') + '</i>').query('.')
               ) AS a CROSS APPLY [XML].nodes('i') AS x(i) ) AS y
           WHERE Item IS NOT NULL
       );
    GO
    

    然后你可以这样改变你的程序:

    ALTER PROCEDURE [dbo].[spBatchRequestsForRescreening] 
        @GuidList varchar(8000)
    AS
    BEGIN
        SET NOCOUNT ON;
    
        SELECT d.* -- probably meant to list specific columns
          FROM dbo.DeniedPartyTransactions AS d
          INNER JOIN dbo.SplitStrings(@GuidList) AS s
          ON d.C1_PK = s.Item;
    END
    GO
    

    (您不必包含所有额外的单引号。)

    您也可以考虑使用表值参数,您可以在此处查看我的答案中的示例:

    Parameters to the EXISTS clause in a stored procedure

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-16
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多