假設值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