执行SQL Server存储过程时出现语法错误
当我尝试执行此操作时,它会抛出以下错误: 变量名'@TblName'已声明。变量名在查询批处理或存储过程中必须是唯一的执行SQL Server存储过程时出现语法错误,sql,sql-server,Sql,Sql Server,当我尝试执行此操作时,它会抛出以下错误: 变量名'@TblName'已声明。变量名在查询批处理或存储过程中必须是唯一的 出现此错误是因为您已在过程中传递了@tblName。您可以通过删除declare并通过过程调用传递值来解决这个问题 除此之外,您还必须使用EXEC来运行更新查询,因为您的表名可能会更改 ALTER PROCEDURE dbo.encrypt @columnname NVARCHAR(100), @TblName NVARCHAR(200) WITH ENC
出现此错误是因为您已在过程中传递了
@tblName
。您可以通过删除declare并通过过程调用传递值来解决这个问题
除此之外,您还必须使用EXEC
来运行更新查询,因为您的表名可能会更改
ALTER PROCEDURE dbo.encrypt
@columnname NVARCHAR(100),
@TblName NVARCHAR(200)
WITH ENCRYPTION
AS
BEGIN
SET NOCOUNT ON;
DECLARE @encryptcolumn NVARCHAR(200);
DECLARE @AlterQuery NVARCHAR(200);
DECLARE @TblName NVARCHAR(200);
OPEN SYMMETRIC KEY Password_Key DECRYPTION BY CERTIFICATE PasswordCertificate;
SET @encryptcolumn = (@columnname + 'encrypt');
IF @encryptcolumn IS NOT NULL
SET @AlterQuery = 'ALTER TABLE ['+@TblName+'] add ['+@encryptcolumn+'] varbinary(max)null);'
EXEC sp_executesql @AlterQuery;
UPDATE @TblName
SET @encryptcolumn = ENCRYPTBYKEY(KEY_GUID('datamartSymKey'), CONVERT(varbinary, @columnname))
END
GO
出现此错误是因为您已在过程中传递了
@tblName
。您可以通过删除declare并通过过程调用传递值来解决这个问题
除此之外,您还必须使用EXEC
来运行更新查询,因为您的表名可能会更改
ALTER PROCEDURE dbo.encrypt
@columnname NVARCHAR(100),
@TblName NVARCHAR(200)
WITH ENCRYPTION
AS
BEGIN
SET NOCOUNT ON;
DECLARE @encryptcolumn NVARCHAR(200);
DECLARE @AlterQuery NVARCHAR(200);
DECLARE @TblName NVARCHAR(200);
OPEN SYMMETRIC KEY Password_Key DECRYPTION BY CERTIFICATE PasswordCertificate;
SET @encryptcolumn = (@columnname + 'encrypt');
IF @encryptcolumn IS NOT NULL
SET @AlterQuery = 'ALTER TABLE ['+@TblName+'] add ['+@encryptcolumn+'] varbinary(max)null);'
EXEC sp_executesql @AlterQuery;
UPDATE @TblName
SET @encryptcolumn = ENCRYPTBYKEY(KEY_GUID('datamartSymKey'), CONVERT(varbinary, @columnname))
END
GO
@TblName
已经是一个参数,但是在删除declare之后,您尝试(重新)在过程体中声明它。抛出此错误无效..必须声明表变量“@TblName”如果要对动态表名进行更新,我很确定您需要使用sp_executesql来执行它,就像您在前面一行中对@AlterQuery
所做的那样,而不只是尝试将表名作为变量传递。您正在使用的语法要求@TblName
成为一个表变量。下面的R Pelzers代码已更新以实现这一点(尽管他使用EXEC
而不是sp_executesql
)无法测试它,但应该做同样的事情。@TblName
已经是一个参数,但您尝试(重新)在过程体中声明它,删除后声明。抛出此错误无效..必须声明表变量“@TblName”如果要对动态表名进行更新,我很确定您需要使用sp_executesql来执行它,就像您在前面一行中对@AlterQuery
所做的那样,而不只是尝试将表名作为变量传递。您正在使用的语法要求将@TblName
作为表变量。下面的R Pelzers代码已更新以实现这一点(尽管他使用EXEC
而不是sp_executesql
),但不能测试它,但应该做同样的事情。@R Pelzer在我删除它时声明抛出此错误。.必须声明表变量“@TblName”.我更新了密码。因为要使用变量表名,所以必须使用“EXEC”来运行更新查询。@R Pelzer在我删除时声明其抛出此错误。.必须声明表变量“@TblName”。我更新了代码。因为要使用变量表名,所以必须使用“EXEC”来运行更新查询。