2

我有 3 张桌子

  • Table_A有一堆行
  • Table_B将使用来自的数据插入行的位置Table_A
  • Table_C保存一个数字(整数),称为code_number

我有一个存储过程(sp_getNextCode),它选择当前code_numberfrom Table_C,创建并返回一个带有这个数字(比如或其他东西)的varchar代码字符串,并用下一个值()更新yyyyMMdd + cast(code_number as varchar)Table_C code_numbercode_number+1

到目前为止,一切都很好。

现在我想在Table_ATable_B使用光标的情况下使用

INSERT INTO TABLE_B 
    SELECT .... FROM TABLE_A 

到目前为止还不错

问题是上述插入语句中的值之一必须是存储过程的输出sp_getNextCode

  • 我不能在语句中使用存储过程
  • 我无法创建与sp_getNextCode函数不能具有相同代码的函数INSERT/UPDATE/DELETE

我没有 SQL Server 2012 的选项(它有一个序列)只有 SQL Server 2008

有什么方法可以实现这一点,或者唯一的方法是使用游标(我真的想避免使用游标,因为我在谈论需要插入的数千行并且需要太长时间)

4

1 回答 1

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

于 2012-08-22T12:41:25.437 回答