假设该值6
不应该被丢弃(如果是,请解释逻辑)。还假设您只想将表 2 中的每一行插入到表 2 中。
INSERT dbo.Table3(table1_ID, table2_ID)
SELECT @ID, ID
FROM dbo.Table2
-- WHERE ID <> 6???
;
如果 ID 列表确实是 CSV,则:
首先创建一个拆分函数(这里描述了几个替代方法,除了它们输出字符串而不是整数),例如
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 或其他集合),您可以使用表值参数并避免拆分的需要。
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
的 asSqlDbType.Structured
而不是将您的 CSV 作为字符串传递。更多信息在这里:
http://www.sqlperformance.com/2012/08/t-sql-queries/splitting-strings-now-with-less-t-sql