假设值6
并不意味着被丢弃(如果是,请解释逻辑)。同时假设你只是想在表2中的每一行插入表2
INSERT dbo.Table3(table1_ID, table2_ID)
SELECT @ID, ID
FROM dbo.Table2
-- WHERE ID <> 6???
;
如果ID列表确实是一个CSV,则:
首先创建一个分割功能( several alternatives described here, except they output strings instead of integers),例如现在
CREATE FUNCTION dbo.SplitInts
(
@List VARCHAR(MAX),
@Delimiter VARCHAR(255)
)
RETURNS @t TABLE(Item INT)
AS
BEGIN
INSERT @t(Item) SELECT CONVERT(INT, SUBSTRING(@List, Number,
CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number))
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects) AS n(Number)
WHERE Number <= CONVERT(INT, LEN(@List))
AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter;
RETURN;
END
GO
存储过程可以简单地说:
CREATE PROCEDURE dbo.whatever
@ID INT,
@IDs VARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.Table3(table1_ID, table2_ID)
SELECT @ID, Item
FROM dbo.SplitInts(@IDs, ',');
END
GO
然而,如果你的SQL Server 2008或以上,并以逗号分隔ID的这个名单是从你的应用程序来(例如,从DataTable或其他设置),您可以使用Table-Valued Parameter并避免分割。
CREATE TYPE dbo.SetOfIntegers
(Number INT);
GO
CREATE PROCEDURE dbo.whatever
@ID INT,
@IDs dbo.SetOfIntegers READONLY
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.Table3(table1_ID, table2_ID)
SELECT @ID, Item
FROM @IDs;
END
GO
然后,你必须改变的C#代码通过您的DataTable
作为SqlDbType.Structured
,而不是通过你的CSV作为一个字符串。更多的信息在这里:
http://www.sqlperformance.com/2012/08/t-sql-queries/splitting-strings-now-with-less-t-sql
什么版本的SQL Server?这个“ID”列表是如何构建的,以及在哪里?为什么值'6'被丢弃? – 2013-03-10 13:01:39
或者如果“list”实际上只是来自'table2'的一个集合,那么您是如何确定这5个(或6?)值属于'ID = 1'?这只是表中的每一行吗?请更好地描述这种关系。 – 2013-03-10 13:22:49