簡體   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