我试图将一些记录插入到多个表中,但条件是某个特定的Id (unique标识符)位于Id (nvarchar)的逗号分隔列表中。
我原以为它是有效的,但它似乎只是将其与列表中的第一个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函数的文章,但如果可能的话,我会避免这种情况。
发布于 2014-02-22 03:01:34
我使用以下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))发布于 2014-02-22 02:45:39
我会将逗号分隔的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) 发布于 2014-02-22 02:54:33
这不是一个非常优雅的解决方案,但确实完成了工作。
替换以下条件:
st.Id in (li.AppliedSalesTaxes) 通过以下方式:
charindex('['+st.Id+']', '['+replace(li.AppliedSalesTaxes,',','][')+']') > 0https://stackoverflow.com/questions/21948686
复制相似问题