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的末端