Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行SQL Server存储过程时出现语法错误_Sql_Sql Server - Fatal编程技术网

执行SQL Server存储过程时出现语法错误

执行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'已声明。变量名在查询批处理或存储过程中必须是唯一的


出现此错误是因为您已在过程中传递了
@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”来运行更新查询。