加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

Sql 使用sysobjects表的动态视图

发布时间:2022-11-16 20:31:02 所属栏目:MsSql教程 来源:互联网
导读: Sql 使用sysobjects表的动态视图
sqlsql-servertsql
Sql 使用sysobjects表的动态视图,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想使用T-SQL脚本动态更改视图。每个月,我的数据库中都有

Sql 使用sysobjects表的动态视图

sqlsql-servertsql

Sql 使用sysobjects表的动态视图,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想使用T-SQL脚本动态更改视图。每个月,我的数据库中都有一个新表mssql 使用视图,我希望在视图中包含这个新表。我的想法是在T-SQL过程中创建一个var,然后构建SQL语句来创建我将用于更改视图的代码。有了这个,我只需要执行@SqlView。现在的挑战是在字符串中获取@SqlResults。有什么想法吗SQL for the view (@SqlView)select a, b from table01union allselect a, b from table02union allselec

我想使用T-SQL脚本动态更改视图。每个月,我的数据库中都有一个新表,我希望在视图中包含这个新表。我的想法是在T-SQL过程中创建一个var,然后构建SQL语句来创建我将用于更改视图的代码。有了这个,我只需要执行@SqlView。现在的挑战是在字符串中获取@SqlResults。有什么想法吗

SQL for the view (@SqlView)
select a, b from table01
union all
select a, b from table02
union all
select a, b from table03
SQL statement for the view code (@SqlResults)
select 'select a,b from '+so.name' union all' from    sysobjects so
join    sys.schemas s
        On  so.uid = s.schema_id
where   so.xtype = 'U'
and so.name like '%table0%'

这是我在尝试为每个表生成脚本时使用的SQL,经过修改以插入您的特定详细信息:

DECLARE @SQLTable TABLE
  (
    ID INT IDENTITY(1,1) NOT NULL,
    Sequel VARCHAR(4000) NOT NULL
  )
INSERT INTO @SQLTable (Sequel)
SELECT 
'SELECT A, B FROM ' + TABLE_NAME + ' UNION ALL'
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '%table0%'
DECLARE @Looper INT = (SELECT MAX(ID) FROM @SQLTable)
DECLARE @Counter INT = 0 
DECLARE @ExecSQL VARCHAR(MAX) = 
    --'' -- use this if you just want to run the SQL
    'ALTER VIEW MyView AS 
    ' -- use this if you want to alter a view
WHILE @Counter <= @Looper 
  BEGIN
    SET @Counter = @Counter + 1
    SELECT @ExecSQL = @ExecSQL + '
    ' + Sequel 
    FROM @SQLTable
    WHERE ID = @Counter 
  END
SET @ExecSQL = 
    LEFT (@ExecSQL, LEN(@ExecSQL) - 10) -- the LEFT() function is to remove the final UNION ALL
    + '
GO'
PRINT (@ExecSQL)

可能有一种方法可以使用游标实现这一点,但我对这种语法不太熟悉。我在类似情况下所做的是使用一些变量和一个表变量或一个临时表。我也没有太多机会使用动态sql,所以这有点像是瞎猜

declare   @view_script as varchar(4000) = 'alter view dbo.my_view as select a, b from table01'
declare   @cur_table as integer = 2
declare   @table_list as table (table_num integer identity(1,1), table_nm varchar(100))
insert into @table_list (table_nm)
select name
from   sys.tables
where  name like '%table0%'
while  @cur_table <= (select max(table_num) from @table_list)
begin
select @view_script = @view_script + 'union all ' + char(10) + select a, b from ' + table_nm
from   @table_list
where  @table_list.table_num = @cur_table
@cur_table = @cur_table + 1
end
exec @view_script

让我知道这是否有效,或者您是否需要更改某些内容才能使其有效。

这里是另一种不使用循环的方法

declare @SqlResults nvarchar(max) = ''
select @SqlResults = @SqlResults + 'select a,b from ' + t.name + ' union all ' 
from sys.tables t
where t.name like '%table0%'
select @SqlResults = 'ALTER VIEW SomeView as ' + left(@SqlResults, LEN(@SqlResults) - 10)
select @SqlResults
--Uncomment the exec line when you are comfortable
--exec sp_executesql @SqlResults

您正在尝试执行将改变视图的动态SQL,还是希望执行将从表中返回结果的动态SQL?这将起作用,但循环不是最佳选择。我们可以不用循环就可以做到这一点。@SeanLange,请随意发布一个更好的答案-就像我说的,这就是我目前使用的。一般来说,我最多只能在几十个表上运行它,而且考虑到它在不到一秒钟的时间内运行,我从未觉得有必要重写它。感谢AHiggins,我认为Sean的解决方案更干净。根本不需要在这里使用while循环或游标。这个解决方案也是有效的,我认为Sean的解决方案更干净。谢谢不需要回路,这就是肖恩!

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!