Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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
在while循环中以过程名称作为变量创建SQL过程_Sql_Sql Server_Tsql_Procedure - Fatal编程技术网

在while循环中以过程名称作为变量创建SQL过程

在while循环中以过程名称作为变量创建SQL过程,sql,sql-server,tsql,procedure,Sql,Sql Server,Tsql,Procedure,有没有办法通过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('userFamilyNam

有没有办法通过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

虽然可能有更好的方法可以做到这一点,但我想这可能是一次性操作,性能可能并不重要。如果是这样,则此修改后的代码应起作用,并为所有属性创建一个
set\u web\u user\u
del\u web\u user\u
过程:

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

为特定语言添加标记。mysql、oracle、ms sql、postgres。。。根据你的问题。您可以使用动态sql实现这一点。在普通sql中没有办法做到这一点。您不应该使用这样的变量,应该将这些变量分配给其他变量(比如@sql),并使用exec或sp_execute sql as exec(@sql)执行它。如果您的循环使用CREATE PROCEDURE语句构建一个字符串,您可能会有更多的乐趣,使用
sp\u execute\u sql
运行该动态sql。但我以前从未尝试从过程中创建过程。对我来说,这感觉有点像一个破碎的设计模式。为什么要这样做,功能要求是什么?您的意思是将创建部分存储在字符串中,然后使用EXEC?您不能创建一个将属性作为参数的SP吗?