2017-04-27 111 views
0

爲了創建一個解決問題的小解決方法,我無法在存儲過程中創建證書/對稱密鑰,我插入了命令作爲文本到代碼,然後應該正確執行。現在我似乎已經準備好了,除了編輯器給我的最後一個錯誤之外。我真的不明白,他想告訴我什麼...MS SQL - 無法綁定多部分標識符「Group.GroupId」

ALTER PROCEDURE [dbo].[Insert_Group] 
-- Add the parameters for the stored procedure here 
@GroupName varchar(50) 
AS 
BEGIN 
declare @SQL varchar(max) 
declare @Key varchar(max) 

-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 
begin tran 
insert into dbo.[Group]([GroupName], [KeyAttribute]) values(@GroupName, '') 

select @SQL = 'IF NOT EXISTS 
(SELECT * FROM sys.certificates WHERE name = ''Cert_'+ [Group].GroupId + ''') 
CREATE CERTIFICATE ''Cert_'' +[Group].GroupId '' 
WITH SUBJECT = ''I like kittens.'';' 

execute (@SQL); 
print @SQL 

select @Key = 'IF NOT EXISTS 
(SELECT * FROM sys.symmetric_keys WHERE name = ''Key_'+[Group].GroupId+''') 
CREATE SYMMETRIC KEY Key_'+[Group].GroupId+' 
WITH ALGORITHM = AES_256 
ENCRYPTION BY CERTIFICATE Cert_'+[Group].GroupId+';' 

execute (@Key) 
print @Key 

commit 

END 

任何想法都是值得歡迎的!

UPDATE

我實現了範圍身份聲明,爲建議,而我加入鑄造它的一點點,使之兼容。儘管如此,它還不是那麼完美。該查詢現在執行正常,但如果我運行該過程它不接受我的盒裝varchar語句。

ALTER PROCEDURE [dbo].[Insert_Group] 
    -- Add the parameters for the stored procedure here 
    @GroupName varchar(50) 
    AS 
BEGIN 
    declare @SQL varchar(max) 
    declare @Key varchar(max) 
    declare @LastInsertId int 

    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    begin tran 
    insert into dbo.[Group] ([GroupName], [KeyAttribute] ,[KeyName], [CertName]) values(@GroupName, '', '', ''); 
    set @LastInsertId = SCOPE_IDENTITY(); 

    update [dbo].[Group] 
    set [KeyName] = 'Key_' + (CAST (@LastInsertId AS varchar(max))) 
    where [GroupId] = @LastInsertId; 

    update dbo.[Group] 
    set [CertName] = 'Cert_' + (CAST (@LastInsertId AS varchar(max))) 
    where [GroupId] = @LastInsertId; 

select @SQL = 'IF NOT EXISTS 
    (SELECT * FROM sys.certificates WHERE name = ''Cert_' +(CAST (@LastInsertId AS varchar(max)))+''') 
    CREATE CERTIFICATE ''Cert_'' +(CAST (@LastInsertId AS varchar(max)))'' 
    WITH SUBJECT = ''I like kittens.'';' 

execute (@SQL) 
print @SQL 

select @Key = 'IF NOT EXISTS 
    (SELECT * FROM sys.symmetric_keys WHERE name = ''Key_'+(CAST (@LastInsertId AS varchar(max)))+''') 
    CREATE SYMMETRIC KEY Key_'+(CAST (@LastInsertId AS varchar(max)))+' 
    WITH ALGORITHM = AES_256 
    ENCRYPTION BY CERTIFICATE Cert_'+(CAST (@LastInsertId AS varchar(max)))+';' 

execute (@Key) 
print @Key 

    commit 

END 
+0

你的代碼看起來是動態和非動態SQL的混合匹配實現,因爲它的語法完全打破。你不能做你想做的事情,所以我建議在當時重新開始並採取一步。 –

+0

我敢打賭,如果我有時間的話,我會的..我只需要讓它現在運行..我仍然可以複製正在運行的項目,並推回到開發。 –

回答

0

隨着[Group].GroupId您似乎嘗試訪問新創建的記錄的主鍵值。但事實上,'[Group] .GroupId'這個表達式並沒有涉及任何內容。

在SQL Server中,這是使用SCOPE_IDENTITY()

DECLARE @GroupID INT 
INSERT ... 
SELECT @GroupID = SCOPE_IDENTITY() 
+0

'Twas一個很好的提示!只是爲了完成:SCOPE_IDENTITY()的返回值自然是int。常量'Cert_'和'Key_'不是。所以爲了使它正確工作,我在陳述中添加了CAST。 (往上看) –

相關問題