【问题标题】:Dynamic SQL To Create View动态 SQL 创建视图
【发布时间】:2021-04-05 17:23:35
【问题描述】:

我有一张表格,其中列出了表现低于标准的商店名称。每个商店名称在服务器上都有自己的数据库(我们正在合并所有数据库,但目前都是分开的)。是否可以迭代表(称为故障存储)并创建一个视图来保存所有故障存储的数据?这是表结构:(当然是垃圾数据)

create table failingstores
(
  storename varchar(100)
  ,weeklysales int
  ,monthlysales int
  ,storemanager varchar(100)
)

Insert Into failingstores Values 
('one', 80, 800, 'managerone'), 
('two', 90, 900, 'managertwo'), 
('three', 40, 400, 'managerthree'), 
('four', 10, 100, 'managerfour')

我想要实现的动态 sql 是迭代 storename 字段中的值并创建一个视图。所以这将是我的视图语法:

Create view failingstoresfulldata As
Select * from managerone
union all
select * from managertwo
union all
select * from managerthree
union all
select * from managerfour

【问题讨论】:

  • 视图中不能有动态 sql。您必须像示例一样对视图进行编码,或者在存储过程中使用动态 sql。

标签: sql-server-2008 view inline-code


【解决方案1】:

我最近不得不做一些类似的事情,并使用动态 SQL 将数据从数据库中提取到本地表中。存储到本地表中当然是可选的,但是一旦存储到本地表中,您就可以在上面构建任何其他 SQL 对象来查询您的内容!

IF OBJECT_ID(N'tempdb..#Databases') is not null
    Drop Table #Databases

Select Name 
Into #Databases
From (Values
     ('Company1DB')
    ,('Company2DB')
    ,('Company3DB')
    ) as db(Name)

Declare @DBName varchar(50),@SQL nvarchar(max)=''

While (select count(*) From #Databases) >1 Begin
    Select Top 1 @DBName=Name From #Databases
    Select @DBName=isnull(@DBName,'')
    Set @SQL=@SQL+'Union All
    SELECT
        Column1
        ,Column2
        ,Column3
    FROM '+@DBName+'.tablename'

    Delete From #Databases where Name=@DBName
End 

Select @SQL=Stuff(@SQL,1,9,'') --- Remove leading "Union All"

Select @SQL --- Preview of Query

--- Pull the data into a single table for easy querying or further manipulation ---
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'FullData') AND type in (N'U')) Begin
    Create Table FullData (
        Column1 int
        ,Column2 int
        ,Column3 int
    )
End Else Begin
    Truncate Table FullData
End

Insert Into FullData Exec SP_ExecuteSQL @SQL,N''

--- Cleanup ---
Drop Table #Databases

【讨论】:

    【解决方案2】:

    我更喜欢更简单的解决方案:

    declare @sql varchar(max) = 'Create view failingstoresfulldata As
    '
    select @sql = @sql +
    'Select * from ' + storemanager + '
    union all
    '
    from failingstores
    
    set @sql = left(@sql, len(@sql)-11)
    print @sql
    --exec (@sql)
    

    先用print检查生成的动态SQL,然后取消注释exec命令下次运行。

    【讨论】:

      猜你喜欢
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      相关资源
      最近更新 更多