有没有办法通过SQL中的while循环创建过程列表?
我试图做的是这样的事情,但是有一个更大的属性表。
Declare @attributes Table (attrkey text, attr_key text)
Insert @attributes(attrkey, attr_key) values('userFirstName', 'user_first_name')
Insert @attributes(attrkey, attr_key) values('userFamilyName', 'user_family_name')
Insert @attributes(attrkey, attr_key) values('userNameExtra', 'user_name_extra')
Declare @attrkey nvarchar(128)
Declare @attr_key nvarchar(128)
Declare @proc_name_set nvarchar(128)
Declare @proc_name_del nvarchar(128)
While exists (Select * From @attributes)
Begin
Select @attrkey = attrkey, @attr_key = attr_key from @attributes
Set @proc_name_set = 'set_web_user_' + @attr_key
Set @proc_name_del = 'del_web_user_' + @attr_key
CREATE PROCEDURE [dbo].[@proc_name_set] @keyval int, @value nvarchar(255) AS
UPDATE web_user SET @attrkey=@value WHERE id=@keyval;
Go
CREATE PROCEDURE [dbo].[@proc_name_del] @keyval int, @value nvarchar(255) AS
UPDATE web_user SET @attrkey=NULL WHERE id=@keyval AND @attrkey=@value;
Go
Delete from @attributes where attrkey like @attrkey
End
答案 0 :(得分:1)
虽然可能有更好的方法可以做到这一点,但我猜这可能是一次性操作,性能可能并不重要。如果是这样,则此修改后的代码应该可以工作,并为所有属性创建set_web_user_
和del_web_user_
过程:
Declare @attributes Table (attrkey text, attr_key text)
Insert @attributes(attrkey, attr_key) values('userFirstName', 'user_first_name')
Insert @attributes(attrkey, attr_key) values('userFamilyName', 'user_family_name')
Insert @attributes(attrkey, attr_key) values('userNameExtra', 'user_name_extra')
Declare @attrkey nvarchar(128)
Declare @attr_key nvarchar(128)
Declare @proc_name_set nvarchar(128)
Declare @proc_name_del nvarchar(128)
Declare @proc_text nvarchar(max)
While exists (Select * From @attributes)
Begin
Select @attrkey = attrkey, @attr_key = attr_key from @attributes
Set @proc_name_set = 'set_web_user_' + @attr_key
Set @proc_name_del = 'del_web_user_' + @attr_key
Set @proc_text = N'CREATE PROCEDURE [dbo].[' + @proc_name_set + '] @keyval int, @value nvarchar(255) AS
UPDATE web_user SET ' + @attrkey + ' = @value WHERE id = @keyval;'
EXEC sp_executesql @proc_text
Set @proc_text = N'CREATE PROCEDURE [dbo].[' + @proc_name_del + '] @keyval int, @value nvarchar(255) AS
UPDATE web_user SET ' + @attrkey + ' = NULL WHERE id = @keyval AND ' + @attrkey + ' = @value;'
EXEC sp_executesql @proc_text
Delete from @attributes where attrkey like @attrkey
End