2017-03-18 120 views
0

我的Management Studio中有以下SQL代码来创建存储过程。当试图执行查询,我得到一个错误信息:SQL Server要求标量变量声明

必须声明标量变量“@Id”

可是我已经宣布@Id - 可能是什么问题呢?

我的代码:

CREATE PROCEDURE [dbo].[DecryptMyName] 
    (@Id Int, 
     @MyName varbinary(MAX)) 
AS 
GO 
OPEN SYMMETRIC KEY SymmetricKeyxx 
DECRYPTION BY CERTIFICATE Certificatexx; 
GO 
-- Now list the original ID, the encrypted ID 
SELECT CONVERT(nvarchar, DecryptByKey(MyName)) 
FROM dbo.MyTable WHERE [email protected] ; 

-- Close the symmetric key 
CLOSE SYMMETRIC KEY SymmetricKeyxx; 
GO 
+1

您不能在存储过程中执行'GO'命令。另外,如果在存储过程中有多个语句,则需要使用'BEGIN'启动过程,并以'END'结束。 –

回答

1

GO不是在存储过程中的身体不允许。我建议你总是将身体放在BEGIN/END以避免这个问题。

这是行不通的?

CREATE PROCEDURE [dbo].[DecryptMyName] (
    @Id Int , 
    @MyName varbinary(MAX) 
) AS 
BEGIN 
    OPEN SYMMETRIC KEY SymmetricKeyxx 
    DECRYPTION BY CERTIFICATE Certificatexx; 

    -- Now list the original ID, the encrypted ID 
    SELECT CONVERT(nvarchar, DecryptByKey(MyName)) 
    FROM dbo.MyTable WHERE [email protected] ; 

    -- Close the symmetric key 
    CLOSE SYMMETRIC KEY SymmetricKeyxx; 

END; 

如果不是,则需要使用动态SQL。

+0

我工作过,非常感谢 –

+1

@EmekaC - 如果此答案解决了您的问题,请继续并将其标记为“已答复”。 – Phylyp

0

在查询只是删除“开始”字,然后将工作

这样:

CREATE PROCEDURE [dbo].[DecryptMyName] 
     (@Id Int, 
      @MyName varbinary(MAX)) 
    AS 

    OPEN SYMMETRIC KEY SymmetricKeyxx 
    DECRYPTION BY CERTIFICATE Certificatexx; 

    -- Now list the original ID, the encrypted ID 
    SELECT CONVERT(nvarchar, DecryptByKey(MyName)) 
    FROM dbo.MyTable WHERE [email protected] ; 

    -- Close the symmetric key 
    CLOSE SYMMETRIC KEY SymmetricKeyxx; 

最佳实践始终使用BEGIN和END语句用于存储过程 这样的:

CREATE PROCEDURE [dbo].[DecryptMyName] 
     (@Id Int, 
      @MyName varbinary(MAX)) 
    AS 
    BEGIN 
    OPEN SYMMETRIC KEY SymmetricKeyxx 
    DECRYPTION BY CERTIFICATE Certificatexx; 

    -- Now list the original ID, the encrypted ID 
    SELECT CONVERT(nvarchar, DecryptByKey(MyName)) 
    FROM dbo.MyTable WHERE [email protected] ; 

    -- Close the symmetric key 
    CLOSE SYMMETRIC KEY SymmetricKeyxx; 
    END