使用2个插入和传递表名作为参数的过程中的问题

时间:2019-03-25 10:06:05

标签: sql-server

我编写了一个过程,以便将同一行插入到2个不同的表中(一个表用于消息的发送方,另一个表用于接收方)

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 个答案:

答案 0 :(得分:4)

您没有将变量@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;

答案 1 :(得分:-2)

这里的问题是,您“ 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