我编写了一个过程,以便将同一行插入到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”
答案 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