从表中插入语句下一个序列获取到另一个表
问题描述:
我有3个表从表中插入语句下一个序列获取到另一个表
-
Table_A
有一堆行 -
Table_B
中行打算用数据插入从Table_A
-
Table_C
持有一个数字(整数)叫code_number
我有一个存储过程(sp_getNextCode
),其选择从Table_C
当前code_number
,创建并返回一个varchar
代码串用这个号码(如yyyyMMdd + cast(code_number as varchar)
或东西),并与下一个值(code_number+1
)
到目前为止好更新Table_C
code_number
。
现在我想用插入数Table_A
行至Table_B
无CURSOR 的使用
INSERT INTO TABLE_B
SELECT .... FROM TABLE_A
再次到目前为止好
的问题是,在一个值上面的插入语句必须是存储过程sp_getNextCode
的输出。
- 我不能使用存储过程中
- 我不能使用相同的代码
sp_getNextCode
的函数创建一个函数的声明不能有INSERT/UPDATE/DELETE
我没有SQL的选项Server 2012(它有一个序列)只有SQL Server 2008
是否有任何方法来实现这一点或唯一的方法是与游标(我真的想避免游标因为我谈论成千上万行需要插入ED和它的时间太长)
答
当然,还有一种方法:创建一个存储过程从TABLE_A阅读,插入伊诺表-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
我ommiting一些细节的改造数字格式化的代码,异常处理和回滚,但我希望你能明白。
诀窍是使用ROW_NUMBER()OVER(ORDER BY ...)函数来获取每行的唯一编号。
旁注:你应该** **不使用'sp_'前缀的存储过程,因为前缀已经通过微软自己使用被保留。尽量避免它,只要你可以 –
感谢marc_s我知道我刚刚为了这个例子而命名它:) – isioutis