繁体   English   中英

在SQL Server中对IN子句使用uniqueidentifier

[英]Using uniqueidentifier with IN Clause in SQL server

我有一个存储过程,将一串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比较。 有人知道如何解决问题吗?

declare @sql varchar(max)
set @sql='SELECT * FROM dbo.Table1 WHERE 
    TableGUID IN ('+@Param+') '

exec (@sql)

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

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

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

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

使用[测试]开始

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM