我试图将一些记录插入到多对多的表中,但条件是特定的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函数的文章,但如果可能的话我会尽量避免这种情况。
答案 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