2017-08-16 123 views
0

我试图自动将多个插入到多个表中。使用动态sql在不同的表中自动插入

基本上,我有一个临时表,客户代码和我添加了一个行号。我也有一个源表,其中包含客户代码和个人信息。现在我想将来自客户1的人员ID插入#1,将来自客户2的所有PersonID插入#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的

的样本数据:

L:Customer_Code和ROWNUMBER

1,1 2,2 3,3 4,4

在现实中,显然Customer code!= RowNumber。

源表:列(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 
+0

请编辑您的问题,将样本数据包含为DDL + DML(创建并插入语句)和期望的结果。 –

+0

看起来有点不尽如人意,不习惯这个编辑器。希望你能弄清楚我的意思。 –

+0

我不想弄清楚你的意思,我想复制并粘贴示例数据并准备好工作。 –

回答

1

您正在使用WHILE @Row。这不是一个布尔表达式,你可能正在寻找类似WHILE @ROW <= SELECT MAX(Rij) FROM #M的东西。

此外,您正在多次执行SELECT...INTO。第二次执行时,表#@Customer_Code已存在,因此您不能执行SELECT...INTO,而必须使用INSERT。最好事先定义表格。 编辑:我想你正在试图为每个Customer_Code做一个临时表,在这种情况下,你应该正确追加变量。这同样适用于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 

在未来,如果您收到错误信息,你至少可以做的是告诉我们什么错误消息实际上说的!

+0

好的,您是对的:消息105,级别15,状态1,行18 字符串' \t AND Customer_Code = @Customer_Code'后未使用的引号。 –

+0

请参阅修改。 – HoneyBadger

+0

#m包含什么 –