如何检查uniqueidentifier是否以逗号分隔的ID列表?

时间:2014-02-22 02:06:53

标签: sql sql-server tsql

我试图将一些记录插入到多对多的表中,但条件是特定的Id(uniqueidentifier)在Id的(nvarchar)的comman分隔列表中。

我原本认为它有效但似乎只将它与列表中的第一个Id进行比较?

如何正确使用列表按预期插入数据。

这是我的Sql片段:

 INSERT LineItemToSalesTax (SalesTax_Id, LineItem_Id) 
    SELECT  st.Id, li.LineItem_Id
    FROM    @LineItems li
            ,SalesTax st 
    WHERE   li.AppliedSalesTaxes IS NOT NULL
    AND     st.Id in (li.AppliedSalesTaxes) 

li.AppliedSalesTaxes具有以下格式的值:

'C23E8882-A630-49B2-9E96-0313A4EC1C6A,3B96B6D4-85E7-4735-8351-1BD07FCFC395'

我已经尝试了几个场景并且没有完全正常工作,我确实发现了一些使用Sql函数的文章,但如果可能的话我会尽量避免这种情况。

3 个答案:

答案 0 :(得分:2)

我使用以下CSV到ROWS功能:

CREATE FUNCTION dbo.CsvToRows
(
    @string NVARCHAR(MAX)
)
RETURNS @ret TABLE 
(
    [Index] INT NOT NULL PRIMARY KEY,
    Value NVARCHAR(500)
)
AS
BEGIN
    DECLARE @pos INT,
            @i INT = 0,
            @piece NVARCHAR(500)

    IF RIGHT(RTRIM(@string),1) <> ','
    BEGIN
        SET @string = @string  + ','
    END

    SET @pos =  PATINDEX('%,%' , @string)
    WHILE @pos <> 0 
    BEGIN
        SET @piece = LEFT(@string, @pos-1)

        INSERT INTO @ret ([Index], Value)
        VALUES (@i, @piece)

        SET @string = STUFF(@string, 1, @pos, '')
        SET @pos =  PATINDEX('%,%', @string)
        SET @i = @i + 1
    END
    RETURN
END

因此您的查询可以变为:

INSERT LineItemToSalesTax (SalesTax_Id, LineItem_Id) 
SELECT  st.Id, li.LineItem_Id
FROM    @LineItems li
       ,SalesTax st 
WHERE   li.AppliedSalesTaxes IS NOT NULL
AND     st.Id in (SELECT CAST(value as UNIQUEIDENTIFIER) FROM dbo.CsvToRows(t.AppliedSalesTaxes))

答案 1 :(得分:0)

我会将逗号分隔的GUID列表放入表中,然后在IN运算符中使用它:

-- get comma delimited list of GUIDs
declare @GUIDs nvarchar(369) -- 10 GUIDs and 9 commas
set @GUIDs = cast(newid() as varchar(36))
while len(@GUIDs) < 369
    begin
        set @GUIDs = @GUIDs + ',' + cast(newid() as varchar(36))
    end

-- put GUIDs in a table with dynamic sql
declare @GUIDTable table(ID uniqueidentifier)
declare @sql nvarchar(max)
set @sql = 'select ''' + replace(@GUIDs,',',''' union select ''') + ''''
insert into @GUIDTable exec(@sql)

然后您的代码将更新为:

INSERT LineItemToSalesTax (SalesTax_Id, LineItem_Id) 
    SELECT  st.Id, li.LineItem_Id
    FROM    @LineItems li
            ,SalesTax st 
WHERE   li.AppliedSalesTaxes IS NOT NULL
        AND     st.Id in (select ID from @GUIDTable) 

答案 2 :(得分:0)

这不是一个非常优雅的解决方案,但可以在线完成工作。

替换条件:

st.Id in (li.AppliedSalesTaxes) 

使用:

charindex('['+st.Id+']', '['+replace(li.AppliedSalesTaxes,',','][')+']') > 0