在 SQL 服务器的存储过程中循环
Loop in stored procedure of SQL Server
我有一个这样的存储过程:
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
将 return "1;2;3;4;5"(每个 select 查询的动态值),我想为 "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',';');
成功了!谢谢大家!
你可以这样写:
INSERT INTO dbo.ManAlarm([Mobile], [Content])
SELECT Mobile, @msg from NodesMobileSMS where NodeID = @nodeid
在上面的查询中,我只是删除了 VALUES
关键字,因此您输入 ManAlarm
table SELECT
的输出
但是如果你想写一个循环,你可以在 NodesMobileSMS
上使用 CURSOR
,但这不是一个好的选择。
编辑(在 Kid1412 评论之后)
如果您想在 ManAlarm
中写入与 NodesMobileSMS
中相同的行,但具有相同的值,您必须按以下方式编写:
INSERT INTO dbo.ManAlarm([Mobile], [Content])
SELECT 1, @msg from NodesMobileSMS where NodeID = @nodeid
如果您想添加任意数量的行,您可以将 INSERT
放入 FOR
循环中
编辑(在 Kid1412 说他使用 Sql Server 2016 之后)
INSERT INTO dbo.ManAlarm([Mobile], [Content])
SELECT STRING_SPLIT(Mobile, ';'), @msg from NodesMobileSMS where NodeID = @nodeid
我有一个这样的存储过程:
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
将 return "1;2;3;4;5"(每个 select 查询的动态值),我想为 "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',';');
成功了!谢谢大家!
你可以这样写:
INSERT INTO dbo.ManAlarm([Mobile], [Content])
SELECT Mobile, @msg from NodesMobileSMS where NodeID = @nodeid
在上面的查询中,我只是删除了 VALUES
关键字,因此您输入 ManAlarm
table SELECT
但是如果你想写一个循环,你可以在 NodesMobileSMS
上使用 CURSOR
,但这不是一个好的选择。
编辑(在 Kid1412 评论之后)
如果您想在 ManAlarm
中写入与 NodesMobileSMS
中相同的行,但具有相同的值,您必须按以下方式编写:
INSERT INTO dbo.ManAlarm([Mobile], [Content])
SELECT 1, @msg from NodesMobileSMS where NodeID = @nodeid
如果您想添加任意数量的行,您可以将 INSERT
放入 FOR
循环中
编辑(在 Kid1412 说他使用 Sql Server 2016 之后)
INSERT INTO dbo.ManAlarm([Mobile], [Content])
SELECT STRING_SPLIT(Mobile, ';'), @msg from NodesMobileSMS where NodeID = @nodeid