从insert语句中的表获取下一个序列到另一个表

时间:2012-08-22 12:21:06

标签: sql-server sql-server-2008 stored-procedures sequence

我有3张桌子

  • Table_A有一堆行
  • Table_B将使用Table_A
  • 中的数据插入行
  • Table_C包含一个名为code_number
  • 的数字(整数)

我有一个存储过程(sp_getNextCode)从code_number中选择当前Table_C,创建并返回一个带有此数字的varchar代码字符串(如{{1} (或其他)并使用下一个值(yyyyMMdd + cast(code_number as varchar))更新Table_C code_number

到目前为止一切顺利。

现在我想在code_number+1Table_A之间插入一些行而不使用游标 使用

Table_B

到目前为止一直很好

问题是上面的insert语句中的一个值必须是存储过程INSERT INTO TABLE_B SELECT .... FROM TABLE_A 的输出。

  • 我无法在语句
  • 中使用存储过程
  • 我无法使用与sp_getNextCode相同的代码创建函数,因为函数不能包含sp_getNextCode

我没有SQL Server 2012(只有序列)的选项,只有SQL Server 2008

有没有办法实现这个或唯一的方法是使用游标(我真的想避免光标导致我在谈论需要插入的数千行并且需要太长时间)

1 个答案:

答案 0 :(得分:1)

当然,有一种方法:创建一个存储过程来读取table_A,插入ino table_b并更新table_C:

BEGIN TRANSACTION

SELECT @last_value=last_vale FROM  Table_C;

SELECT @records_to_insert = COUNT(*) 
FROM Table_A
WHERE <Conditions>

INSERT INTO TABLE_A
SELECT <Fields>,...., @last_value + ROW_NUMBER() 
OVER(ORDER BY <some ordering criteria>)
FROM TABLE_A
WHERE <Conditions>

UPATE Table_C
SET last_value = @last_value + @records_to_insert +1

COMMIT TRANSACTION

我将一些细节省略为将数字转换为格式化代码,异常处理和回滚,但我希望你能得到这个想法。

诀窍是使用ROW_NUMBER()OVER(ORDER BY ...)函数来获取每行的唯一编号。

http://msdn.microsoft.com/en-us/library/ms186734.aspx