使用动态 sql 自动插入不同的表
Using dynamic sql to automate inserts in different tables
我正在尝试将多个插入自动化到多个 tables。
基本上,我有一个带有客户代码的临时 table,并且我添加了一个行号。我还有一个来源 tables,其中包含客户代码和个人信息。现在我想将客户 1 的所有人员 ID 插入#1,将客户 2 的所有人员 ID 插入#2,依此类推。
我使用了这段代码,但它产生了一个错误:
DECLARE @Customer_Code INT
DECLARE @Row INT = 1
DECLARE @SQL NVARCHAR (MAX)
WHILE @Row = SELECT MAX(Rij) FROM #M
BEGIN
SELECT @Customer_Code = Customer_Code FROM #M WHERE RowNr = @Row
SET @SQL =
'SELECT PersonID
INTO #@Customer_Code
FROM T_Sourcetable
WHERE YEAR (Date) = 2016
AND Customer_Code = @Customer_Code'
EXECUTE (@SQL)
SET @Row = @Row + 1
SET @SQL = ''
END
任何人都可以在这里帮助我。提前致谢。
PS。我正在使用 MS SQL Server 2008。
示例数据:
M: Customer_Code AND 行号
1,1
2,2
3,3
4,4
实际上,显然是Customer code != RowNumber.
来源Table:列(Customer_Code PersonID)
1, 8 ,
1, 9 ,
1, 10,
1, 11,
2, 9 ,
2, 12,
2, 13,
2, 14,
3, 8 ,
3, 14,
3, 15,
3, 17,
4, 8 ,
4, 10,
4, 12,
4, 14
结果应该是:
Table #1:
PersonID
8
9
10
11
Table #2
PersonID
9
12
13
14
Table #3
PersonID
8
14
15
17
Table #4
PersonID
8
10
12
14
您正在使用 WHILE @Row
。这不是布尔表达式,您可能正在寻找类似 WHILE @ROW <= SELECT MAX(Rij) FROM #M
的内容。
此外,您正在多次执行 SELECT...INTO
。第二次执行时,table #@Customer_Code
已经存在,因此您不能执行 SELECT...INTO
而是必须使用 INSERT
。最好事先定义 table 。 edit: 我想你正在尝试为每个 Customer_Code
创建一个临时的 table,在这种情况下你应该正确地附加变量。 AND Customer_Code = @Customer_Code'
也是如此,变量被附加为文字字符串,而不是它所持有的值。
为 #M
中的每一行执行的查询是:
SELECT PersonID
INTO #@Customer_Code
FROM T_Sourcetable
WHERE YEAR (Date) = 2016
AND Customer_Code = @Customer_Code
这显然不是你的本意。您需要的是:
'SELECT PersonID
INTO #'+ @Customer_Code +
'FROM T_Sourcetable
WHERE YEAR (Date) = 2016
AND Customer_Code = '+ @Customer_Code
以后,如果您收到错误消息,您至少可以告诉我们错误消息的实际内容!
我正在尝试将多个插入自动化到多个 tables。
基本上,我有一个带有客户代码的临时 table,并且我添加了一个行号。我还有一个来源 tables,其中包含客户代码和个人信息。现在我想将客户 1 的所有人员 ID 插入#1,将客户 2 的所有人员 ID 插入#2,依此类推。
我使用了这段代码,但它产生了一个错误:
DECLARE @Customer_Code INT
DECLARE @Row INT = 1
DECLARE @SQL NVARCHAR (MAX)
WHILE @Row = SELECT MAX(Rij) FROM #M
BEGIN
SELECT @Customer_Code = Customer_Code FROM #M WHERE RowNr = @Row
SET @SQL =
'SELECT PersonID
INTO #@Customer_Code
FROM T_Sourcetable
WHERE YEAR (Date) = 2016
AND Customer_Code = @Customer_Code'
EXECUTE (@SQL)
SET @Row = @Row + 1
SET @SQL = ''
END
任何人都可以在这里帮助我。提前致谢。
PS。我正在使用 MS SQL Server 2008。
示例数据:
M: Customer_Code AND 行号
1,1 2,2 3,3 4,4
实际上,显然是Customer code != RowNumber.
来源Table:列(Customer_Code PersonID)
1, 8 ,
1, 9 ,
1, 10,
1, 11,
2, 9 ,
2, 12,
2, 13,
2, 14,
3, 8 ,
3, 14,
3, 15,
3, 17,
4, 8 ,
4, 10,
4, 12,
4, 14
结果应该是:
Table #1:
PersonID
8
9
10
11
Table #2
PersonID
9
12
13
14
Table #3
PersonID
8
14
15
17
Table #4
PersonID
8
10
12
14
您正在使用 WHILE @Row
。这不是布尔表达式,您可能正在寻找类似 WHILE @ROW <= SELECT MAX(Rij) FROM #M
的内容。
此外,您正在多次执行 SELECT...INTO
。第二次执行时,table #@Customer_Code
已经存在,因此您不能执行 SELECT...INTO
而是必须使用 INSERT
。最好事先定义 table 。 edit: 我想你正在尝试为每个 Customer_Code
创建一个临时的 table,在这种情况下你应该正确地附加变量。 AND Customer_Code = @Customer_Code'
也是如此,变量被附加为文字字符串,而不是它所持有的值。
为 #M
中的每一行执行的查询是:
SELECT PersonID
INTO #@Customer_Code
FROM T_Sourcetable
WHERE YEAR (Date) = 2016
AND Customer_Code = @Customer_Code
这显然不是你的本意。您需要的是:
'SELECT PersonID
INTO #'+ @Customer_Code +
'FROM T_Sourcetable
WHERE YEAR (Date) = 2016
AND Customer_Code = '+ @Customer_Code
以后,如果您收到错误消息,您至少可以告诉我们错误消息的实际内容!