首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查以逗号分隔的ids列表中的delimited?

如何检查以逗号分隔的ids列表中的delimited?
EN

Stack Overflow用户
提问于 2014-02-22 02:06:52
回答 3查看 1.7K关注 0票数 1

我试图将一些记录插入到多个表中,但条件是某个特定的Id (unique标识符)位于Id (nvarchar)的逗号分隔列表中。

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

如何正确地使用列表插入我所期望的数据。

下面是我的Sql的一个片段:

代码语言:javascript
复制
 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函数的文章,但如果可能的话,我会避免这种情况。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-22 03:01:34

我使用以下CSV来处理ROWS函数:

代码语言:javascript
复制
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

因此,您的查询可以变成:

代码语言:javascript
复制
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))
票数 2
EN

Stack Overflow用户

发布于 2014-02-22 02:45:39

我会将逗号分隔的GUID列表放入一个表中,然后在您的IN操作符中使用它:

代码语言:javascript
复制
-- 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)

然后将您的代码更新为:

代码语言:javascript
复制
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) 
票数 0
EN

Stack Overflow用户

发布于 2014-02-22 02:54:33

这不是一个非常优雅的解决方案,但确实完成了工作。

替换以下条件:

代码语言:javascript
复制
st.Id in (li.AppliedSalesTaxes) 

通过以下方式:

代码语言:javascript
复制
charindex('['+st.Id+']', '['+replace(li.AppliedSalesTaxes,',','][')+']') > 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21948686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档