【发布时间】:2019-11-11 07:55:24
【问题描述】:
我有一个这样的存储过程:
ALTER PROCEDURE [dbo].[insert_sms]
(@msg VARCHAR(MAX), @nodeid INT)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO dbo.ManAlarm ([Mobile], [Content])
VALUES ((SELECT Mobile FROM NodesMobileSMS WHERE NodeID = @nodeid), @msg);
END
如何编写循环脚本,让(select Mobile from NodesMobileSMS) 中的每个手机号码执行插入查询?
编辑:
select Mobile
from NodesMobileSMS
where NodeID = @nodeid
将返回“1;2;3;4;5”(每个选择查询的动态值),我想为“1;2;3;4;5”中的每个数字编写一个循环,它会在ManAlarm 中插入一行:
INSERT INTO dbo.ManAlarm ([Mobile], [Content])
VALUES (1, @msg);
INSERT INTO dbo.ManAlarm ([Mobile], [Content])
VALUES (2, @msg);
...
INSERT INTO dbo.ManAlarm ([Mobile], [Content])
VALUES (5, @msg);
但不像这样插入:
INSERT INTO dbo.ManAlarm ([Mobile], [Content])
VALUES ('1;2;3;4;5', @msg);
编辑2: 我写了一个函数 splitString 并插入查询:
INSERT INTO dbo.ManAlarm ([Mobile], [Content])
SELECT *,'message' from dbo.splitString('1;2;3;4;5',';');
成功了!谢谢大家!
【问题讨论】:
-
不要在 SQL 中使用循环,该语言已准备好处理每个操作的行集。循环和游标很慢,通常是不好的做法,但有一些例外。您可以搜索术语 RBAR 以了解更多信息。
-
请记住,如果您打算插入 100000 条记录,这不是一种有效的方法。
-
不,最多只插入 20 行记录
-
请发布您的数据集和您希望的结果集
-
亲,您的查询结果是 1;2;3;4;5(这些值只有一行),所以您想拆分这些值并放入您的表中?
标签: sql-server stored-procedures sql-server-2008-r2