Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
Sql server 将列值指定给mssql中的变量_Sql Server_Tsql_Variables - Fatal编程技术网

Sql server 将列值指定给mssql中的变量

Sql server 将列值指定给mssql中的变量,sql-server,tsql,variables,Sql Server,Tsql,Variables,我试图将模式的所有表名分配给一个变量。稍后,我希望为每个表创建一个更新触发器。 我使用以下方法提取表: select table_name from information_schema.tables; 执行以下操作时,会得到空值: declare @tablename nvarchar(max) select table_name = @tablename from information_schema.tables; 我在SSMS2016中使用mssql,有人能告诉我如何将表名分配给变量

我试图将模式的所有表名分配给一个变量。稍后,我希望为每个表创建一个更新触发器。 我使用以下方法提取表:

select table_name from information_schema.tables;
执行以下操作时,会得到空值:

declare @tablename nvarchar(max)
select table_name = @tablename from information_schema.tables;

我在SSMS2016中使用mssql,有人能告诉我如何将表名分配给变量吗?

如果为每个表和任何表创建触发器是个好主意,那么这是一个非常好的问题,但是-每当我需要创建语句时-我建议:

select CONCAT('CREATE TRIGGER ',QUOTENAME(CONCAT(table_name,'_trigger')),' ON ',QUOTENAME(table_name),' AFTER UPDATE AS BEGIN PRINT ''yeah!''; END',CHAR(13),CHAR(10),'GO' )
from information_schema.tables
where TABLE_TYPE='BASE TABLE';
将输出发送到text,您将获得:

CREATE TRIGGER [SomeTable_trigger] ON [SomeTable] AFTER UPDATE AS BEGIN PRINT 'yeah!'; END
GO
CREATE TRIGGER [Another_trigger] ON [Another] AFTER UPDATE AS BEGIN PRINT 'yeah!'; END
GO
... more of this...
GO
...

下一步是将所有这些语句复制到一个新的查询窗口,并根据您的需要调整它们。

对于赋值,它是
@Variable=ColumnName
而不是
ColumnName=@Variable
。后者是
ColumnName=Alias
。您不能将MySQL与SSMS一起使用。无论如何,SSMS只是一个客户端工具,它的版本不会影响您执行的SQL代码。因此,不要将
@tablename
声明为
nvarchar(MAX)
;使用
sysname
。该数据类型专门为存储对象名称设计,是
nvarchar(128)notnull
的同义词。(*注意:数据类型的
notnull
属性对变量没有影响,但在列中使用时会有影响。)至于查询,是否可能有输入错误?这将为每个表返回一次
@tablename
的内容。由于
@tablename
为空,因此将返回名为
Table\u name
的空值。你想干什么?为什么不直接使用
从information\u schema.tables中选择table\u name?即使要将表名分配给变量,也不能将多个值分配给单个字符串变量。您必须创建一个表变量并将结果存储在其中。如果您将此concat的结果写入一个变量中,您可以在创建这些变量后使用execute sp_executesqlstatements@Isparia我的“正常”做法是1)将其写入一个表变量,2)使用
光标将其向下移动。但在给定的情况下,我假设触发器的内容在任何情况下都可能不相同,OP希望将这些语句存储为普通脚本(以供将来使用)。当我使用这种想法生成sql命令时,我得到了错误-create trigger必须是批处理中唯一的语句。我尝试在concat语句的开头和结尾添加GO,但错误尚未解决。@Jenna GO必须在自己的行上。这就是为什么我写了“发送到文本输出”网格输出将省略换行符…它对字符数有限制吗?它正在切断cmd的末端