爲了創建一個解決問題的小解決方法,我無法在存儲過程中創建證書/對稱密鑰,我插入了命令作爲文本到代碼,然後應該正確執行。現在我似乎已經準備好了,除了編輯器給我的最後一個錯誤之外。我真的不明白,他想告訴我什麼...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
我實現了範圍身份聲明,爲devio建議,而我加入鑄造它的一點點,使之兼容。儘管如此,它還不是那麼完美。該查詢現在執行正常,但如果我運行該過程它不接受我的盒裝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
你的代碼看起來是動態和非動態SQL的混合匹配實現,因爲它的語法完全打破。你不能做你想做的事情,所以我建議在當時重新開始並採取一步。 –
我敢打賭,如果我有時間的話,我會的..我只需要讓它現在運行..我仍然可以複製正在運行的項目,並推回到開發。 –