从表中插入语句下一个序列获取到另一个表

问题描述:

我有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_Ccode_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和它的时间太长)

+0

旁注:你应该** **不使用'sp_'前缀的存储过程,因为前缀已经通过微软自己使用被保留。尽量避免它,只要你可以 –

+0

感谢marc_s我知道我刚刚为了这个例子而命名它:) – isioutis

当然,还有一种方法:创建一个存储过程从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 ...)函数来获取每行的唯一编号。

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

+0

我会马上检查它。谢谢:) – isioutis

+0

好吧,它不是我需要的100%,但它帮助我解决了我遇到的问题。我只需要创建一个函数,获取@last_value和ROW_NUMBER()并返回一个新的varchar() – isioutis