在SQL Server中将唯一标识符与IN子句一起使用

问题描述 投票:3回答:3

我有一个存储过程,将一串GUID作为输入,并从表GUID IN(@Param)中选择。

@Param = 'b2e16cdc-1f1b-40e2-a979-f87a6a2457af,
c275dd13-bb54-4b8c-aa12-220b5980cabd,
af3552ec-37b1-4a76-81ad-1bd6b8c4cd6c,
3a7fda02-558b-49a9-a870-30350254d8c0,'
    SELECT * FROM dbo.Table1 WHERE 
    TableGUID IN (@Param) 

但是,我注意到只有第一个GUID匹配时查询才返回值,否则它将不返回任何内容。这意味着它仅与字符串中的第一个GUID比较。有人知道如何解决问题吗?

sql sql-server stored-procedures uniqueidentifier in-clause
3个回答
1
投票
declare @sql varchar(max)
set @sql='SELECT * FROM dbo.Table1 WHERE 
    TableGUID IN ('+@Param+') '

exec (@sql)

1
投票

除了MikkaRin的答案:GUID必须用撇号封闭,因此参数中的值应类似于'b2e16cdc-1f1b-40e2-a979-f87a6a2457af', 'c275dd13-bb54-4b8c-aa12-220b5980cabd', 'af3552ec-37b1-4a76-81ad-1bd6b8c4cd6c', '3a7fda02-558b-49a9-a870-30350254d8c0'

最后,您必须传递类似以下内容: @Param = '''b2e16cdc-1f1b-40e2-a979-f87a6a2457af'', ''c275dd13-bb54-4b8c-aa12-220b5980cabd'', ''af3552ec-37b1-4a76-81ad-1bd6b8c4cd6c'', ''3a7fda02-558b-49a9-a870-30350254d8c0'''

请注意列表的最后一个逗号。应该将其删除。


0
投票

我们无法做到,因为SQL没有列表,数组或其他有用数据结构的概念-它仅了解表(以及基于表的信息),因此在编译字符串时将字符串列表转换为表结构命令-它不能编译变量字符串,因此它会抱怨并且使您烦恼。至少,我知道。

我们要做的是首先将逗号分隔的值转换为表。我的最初版本是内联的,相当凌乱,因此我将其重新设计为用户功能,并使之更加通用。

USE [Testing] GO

CREATE FUNCTION [dbo].[VarcharToTable] (@InStr NVARCHAR(MAX))
RETURNS @TempTab TABLE
   (id UNIQUEIDENTIFIER NOT NULL)
AS
BEGIN
    ;-- Ensure input ends with comma
    SET @InStr = REPLACE(@InStr + ',', ',,', ',')
    DECLARE @SP INT
    DECLARE @VALUE NVARCHAR(MAX)
    WHILE PATINDEX('%,%', @INSTR ) <> 0 
    BEGIN
       SELECT  @SP = PATINDEX('%,%',@INSTR)
       SELECT  @VALUE = LEFT(@INSTR , @SP - 1)
       SELECT  @INSTR = STUFF(@INSTR, 1, @SP, '')
       INSERT INTO @TempTab(id) VALUES (@VALUE)
    END
        RETURN

END
GO

这将创建一个用户函数,该函数采用逗号分隔的值字符串,并将其转换为SQL可以理解的表-只需将其传递给字符串,然后就可以解决。很明显,它是如何工作的,唯一的复杂性是REPLACE部分,该部分通过附加一个逗号并从字符串中删除所有双逗号来确保该字符串以单个逗号终止。如果没有这个,则while循环将变得更难处理,因为最终数字可能会或可能不会有终止逗号,并且必须单独处理。

DECLARE @LIST NVARCHAR(MAX)
SET @LIST = '973150D4-0D5E-4AD0-87E1-037B9D4FC03B,973150d4-0d5e-4ad0-87e1-037b9d4fc03c'
SELECT Id, Descr FROM TableA WHERE Id IN (SELECT * FROM dbo.VarcharToTable(@LIST))
© www.soinside.com 2019 - 2024. All rights reserved.