Цикл в хранимой процедуре SQL Server - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть хранимая процедура, подобная этой:

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) будет выполнять запрос на вставку?

Edit :

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);

Edit2 : я написал функцию splitString и вставил с запросом:

INSERT INTO dbo.ManAlarm ([Mobile], [Content]) 
SELECT *,'message' from dbo.splitString('1;2;3;4;5',';');

Это успешно! Спасибо всем!

1 Ответ

1 голос
/ 11 ноября 2019

Вы можете написать следующим образом:

INSERT INTO dbo.ManAlarm([Mobile], [Content]) 
SELECT Mobile, @msg from NodesMobileSMS where NodeID = @nodeid

В верхнем запросе я просто удалил ключевое слово VALUES, поэтому вы добавили в таблицу ManAlarm вывод SELECT

Но если вы хотите написать цикл, вы можете использовать CURSOR для NodesMobileSMS, но это не очень хороший выбор для производительности.

EDIT (после комментария Kid1412)

Если вы хотите записать в ManAlarm те же строки, что и в NodesMobileSMS, но с тем же значением, вы должны написать следующее:

INSERT INTO dbo.ManAlarm([Mobile], [Content]) 
SELECT 1, @msg from NodesMobileSMS where NodeID = @nodeid

Если вы хотите добавитьпроизвольное количество строк, которые вы можете поместить INSERT в цикл FOR

EDIT (после того, как Kid1412 сказал, что он использует Sql Server 2016)

INSERT INTO dbo.ManAlarm([Mobile], [Content]) 
SELECT STRING_SPLIT(Mobile, ';'), @msg from NodesMobileSMS where NodeID = @nodeid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...