1

ストアド プロシージャの呼び出し

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

「文字列からuniqueidentifierへの変換時に変換に失敗しました」で失敗します。

ストアド プロシージャ

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
4

1 に答える 1

2

分割関数を作成します。

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

(余分な一重引用符をすべて含める必要はありません。)

テーブル値のパラメーターを検討することもできます。私の答えの例をここで見ることができます。

ストアドプロシージャのEXISTS句のパラメータ

于 2012-06-15T03:51:01.953 に答える