Проблема в процедуре с 2 вставками и передачей имени таблицы в качестве параметра - PullRequest
0 голосов
/ 25 марта 2019

Я написал процедуру для вставки одной и той же строки в две разные таблицы (одна таблица для отправителя сообщения, а другая для получателя)

CREATE PROCEDURE InsertMsg
    @tablesrc VARCHAR(50),
    @tabeldest VARCHAR(50),
    @src VARCHAR(50),
    @dest VARCHAR(50),
    @contenu VARCHAR(500)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @Sql NVARCHAR(MAX);

    SET @Sql = N'INSERT INTO '+ QUOTENAME(@tablesrc)+' (src,dest,contenu,dateEnvoi,Vu) values (@src,@dest,@contenu,GETDATE(),0)'
          + N'INSERT INTO '+ QUOTENAME(@tabeldest)+' (src,dest,contenu,dateEnvoi,Vu) values (@src,@dest,@contenu,GETDATE(),0)'
    EXECUTE sp_executesql @Sql
END

Выполнение

execute InsertMsg 'MSG_RS_80f355a2', 'MSG_RS_80f355a2', 'RS_80f355a2', 'RS_80f355a2', 'test procedure'

Я получаю эту ошибку:

Необходимо объявить скалярную переменную "@src"

Ответы [ 2 ]

4 голосов
/ 25 марта 2019

Вы не передаете значения своих переменных @src, @dest и @contenu в sp_executesql.Вам необходимо параметризовать утверждение:

EXECUTE sp_executesql @Sql,
                      N'@srv varchar(50), @dest varchar(50), @contenu varchar(500)',
                      @srv = @srv,
                      @dest = @dest,
                      @contenu = @contenu;
0 голосов
/ 25 марта 2019

Проблема здесь в том, что вы "sp_executesql" исполняете код в другом контексте, поэтому он не будет видеть ваши переменные, поэтому для исправления нужно сделать так:

CREATE PROCEDURE InsertMsg @tablesrc VARCHAR(50),
  @tabeldest VARCHAR(50),
  @src VARCHAR(50),
  @dest VARCHAR(50),
  @contenu VARCHAR(500)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @Sql NVARCHAR(MAX);

    SET @Sql = N'INSERT INTO ' + QUOTENAME(@tablesrc) + ' (src,dest,contenu,dateEnvoi,Vu) values (''' + @src + ''',''' + @dest + ''',''' + @contenu + ''',GETDATE(),0)'
    + N'INSERT INTO ' + QUOTENAME(@tabeldest) + ' (src,dest,contenu,dateEnvoi,Vu) values (''' + @src + ''',''' + @dest + ''',''' + @contenu + ''',GETDATE(),0)'
    EXECUTE sp_executesql @Sql
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...