【问题标题】:How to combine multiple dynamic query如何组合多个动态查询
【发布时间】:2017-03-28 17:18:18
【问题描述】:

下面我自己的回答解决了问题

我指的是How to combine two dynamic sql with union ALL,但它不起作用

我的查询的问题是 union 方法无法工作,因为它没有从顶部的变量中获取数据,因为它已经被执行了:exec(insert1) 和 exec(insert2)

而union的目的是稍后通过选择'table_catalog'来获取db_name,因为如果在比较之前选择了'table_catalog',输出会出错

这是查询

    Declare @PilotDBName nvarchar(255)
Declare @LiveDBName nvarchar(255)

Declare @Table1 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255)) 
Declare @Table2 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))  
Declare @Table3 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))  
Declare @Table4 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))  
Declare @Table5 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))  
Declare @Table6 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255), table_catalog nvarchar(255))  
Declare @Table7 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255), table_catalog nvarchar(255)) 

Set @PilotDBName = 'LON_HRMS'
Set @LiveDBName = 'VSM641SP3QC'

Declare @insert1 NVARCHAR(MAX) 
set @insert1 = '
Declare @Table1 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255)) 
INSERT INTO @Table1
SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME, b.table_type
FROM '+@PilotDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@PilotDBName+'.information_schema.tables b 
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''BASE TABLE''

EXCEPT 

SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME,b.table_type
FROM '+@LiveDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@LiveDBName+'.information_schema.tables b 
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''BASE TABLE'' ORDER BY VIEW_NAME '
EXEC(@insert1)

Declare @insert2 NVARCHAR(MAX)
Declare @SQLResult NVARCHAR(MAX)
Set @insert2 = '
Declare @Table2 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255)) 
INSERT INTO @Table2
SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME, b.table_type
FROM '+@LiveDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@LiveDBName+'.information_schema.tables b 
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''BASE TABLE''

EXCEPT 

SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME,b.table_type
FROM '+@PilotDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@PilotDBName+'.information_schema.tables b 
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''BASE TABLE'' ORDER BY VIEW_NAME '
Exec(@insert2)


Declare @insert5 NVARCHAR(MAX) = '
Declare @Table1 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255)) 
Declare @Table2 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255)) 
Declare @Table5 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255)) 
Insert into @Table5
select * From Table1
Union
select * from @Table2'
Exec(@insert1)Exec(@insert2)Exec(@insert5)

在我显示输出之前,查询中的记录是:

插入 1:243 行 插入 2:1 行 插入 5:0 行

【问题讨论】:

  • 我不能 100% 确定您要做什么,但 INSERTSET 不要在同一个声明中同时出现。
  • 我会在一分钟内更新我的查询
  • 这是因为您在 2 个查询字符串上声明了表变量。删除 DECLARE 并插入部分,你应该很高兴。
  • @BennjoeMordeno 它不起作用,我的查询需要声明语句,否则它会提示我声明。是的,我的表已经在顶部声明了,但需要声明。
  • @BennjoeMordeno stackoverflow.com/questions/30891932/… 这就是为什么我需要在查询中声明

标签: sql sql-server dynamic-sql dynamicquery


【解决方案1】:

我自己找到了答案,基本上我要做的就是把所有东西都扔进一大块动态sql中

并且表变量必须在内部声明,而其余的可以将其留在动态查询之外

Declare @PilotDBName nvarchar(255)
Declare @LiveDBName nvarchar(255)
Set @PilotDBName = 'LON_HRMS'
Set @LiveDBName = 'VSM641SP3QC'

Declare @insert1 NVARCHAR(MAX) = '
Declare @Table1 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255)) 
Declare @Table2 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))  
Declare @Table3 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))  
Declare @Table4 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255))  
Declare @Table5 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255), Table_In nvarchar(255))  
Declare @Table6 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255), Table_In nvarchar(255))  
Declare @Table7 Table(TABLE_SCHEMA nvarchar(255)  , VIEW_NAME nvarchar(255), COLUMN_NAME nvarchar(255), table_type nvarchar(255), Table_In nvarchar(255)) 


INSERT INTO @Table1
SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME, b.table_type
FROM '+@PilotDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@PilotDBName+'.information_schema.tables b 
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''BASE TABLE''

EXCEPT 

SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME,b.table_type
FROM '+@LiveDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@LiveDBName+'.information_schema.tables b 
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''BASE TABLE'' ORDER BY VIEW_NAME 


INSERT INTO @Table2
SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME, b.table_type
FROM '+@LiveDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@LiveDBName+'.information_schema.tables b 
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''BASE TABLE''

EXCEPT 

SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME,b.table_type
FROM '+@PilotDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@PilotDBName+'.information_schema.tables b 
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''BASE TABLE'' ORDER BY VIEW_NAME 

INSERT INTO @Table3
SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME, b.table_type
FROM '+@PilotDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@PilotDBName+'.information_schema.tables b 
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''VIEW''

EXCEPT 

SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME,b.table_type
FROM '+@LiveDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@LiveDBName+'.information_schema.tables b 
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''VIEW'' ORDER BY VIEW_NAME  

INSERT INTO @Table4
SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME, b.table_type
FROM '+@LiveDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@LiveDBName+'.information_schema.tables b 
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''VIEW''

EXCEPT 

SELECT a.TABLE_SCHEMA, a.VIEW_NAME, COLUMN_NAME,b.table_type
FROM '+@PilotDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE a Inner join '+@PilotDBName+'.information_schema.tables b 
on a.TABLE_NAME = b.TABLE_NAME
where b.table_type=''VIEW'' ORDER BY VIEW_NAME  

Insert into @Table5
select a.TABLE_SCHEMA, a.VIEW_NAME, a.COLUMN_NAME As Column_Missing,a.table_type, info.TABLE_CATALOG As Found_In  from @Table1 a , '+@PilotDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE info
Union
select b.TABLE_SCHEMA, b.VIEW_NAME, b.COLUMN_NAME As Column_Missing,b.table_type, info.TABLE_CATALOG As Found_In from @Table2 b , '+@LiveDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE info
order by table_catalog

Insert into @Table6
select a.TABLE_SCHEMA, a.VIEW_NAME, a.COLUMN_NAME As Column_Missing,a.table_type, info.TABLE_CATALOG As Found_In  from @Table3 a , '+@PilotDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE info
Union 
select b.TABLE_SCHEMA, b.VIEW_NAME, b.COLUMN_NAME As Column_Missing,b.table_type, info.TABLE_CATALOG As Found_In  from @Table4 b , '+@LiveDBName+'.INFORMATION_SCHEMA.VIEW_COLUMN_USAGE info


select * from @Table5 a 
Union 
select * from @Table6 b '
Exec(@insert1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2022-12-10
    • 2015-08-06
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多