我有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+1
到Table_A
之间插入一些行而不使用游标
使用
Table_B
到目前为止一直很好
问题是上面的insert语句中的一个值必须是存储过程INSERT INTO TABLE_B
SELECT .... FROM TABLE_A
的输出。
sp_getNextCode
相同的代码创建函数,因为函数不能包含sp_getNextCode
我没有SQL Server 2012(只有序列)的选项,只有SQL Server 2008
有没有办法实现这个或唯一的方法是使用游标(我真的想避免光标导致我在谈论需要插入的数千行并且需要太长时间)
答案 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 ...)函数来获取每行的唯一编号。