我需要编写一个插入查询,使用来自不同表的数据将一些行插入到表中。我有:
@ID
,其中包含表中新插入行的ID。 (1)ID
s 现在我需要为(2)中的每个ID
插入表格(3)中的新行。
因此,如果@ID=2
和ID = 1, 2, 3, 4, 5, 6
,我想在表(3)中插入以下行:
table1_ID table2_ID
--------- ---------
1 1
1 2
1 3
1 4
1 5
答案 0 :(得分:0)
假设值6
并不意味着被丢弃(如果是,请解释逻辑)。还假设您只想将表2中的每一行插入表2中。
INSERT dbo.Table3(table1_ID, table2_ID)
SELECT @ID, ID
FROM dbo.Table2
-- WHERE ID <> 6???
;
如果ID列表实际上是CSV ,则:
首先创建一个Split函数(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