Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 我需要一个想法来打印150个表中存在的特定列的值。_Sql_Sql Server - Fatal编程技术网

Sql 我需要一个想法来打印150个表中存在的特定列的值。

Sql 我需要一个想法来打印150个表中存在的特定列的值。,sql,sql-server,Sql,Sql Server,我想找到150个表的最大日期值。我不想为这150个表中的每一个单独编写sql。有没有办法将所有150个表放入一个查询并打印150个最大日期值?谢谢 您可以对150个表进行并集,并获得最大日期值。但是,避免手动输入所有150个表的唯一方法是使用动态sql。您可以对150个表进行并集,并获得最大日期值。但是,避免手动输入所有150个表的唯一方法是使用动态sql select max(maxd) from ( Select max(date_column) as maxd from table

我想找到150个表的最大日期值。我不想为这150个表中的每一个单独编写sql。有没有办法将所有150个表放入一个查询并打印150个最大日期值?谢谢

您可以对150个表进行并集,并获得最大日期值。但是,避免手动输入所有150个表的唯一方法是使用动态sql。

您可以对150个表进行并集,并获得最大日期值。但是,避免手动输入所有150个表的唯一方法是使用动态sql

select max(maxd) from (
    Select max(date_column) as maxd from table1
    union 
    Select max(date_column) as maxd from table2
    union 
    ....
) t
这里有一条路

select max(maxd) from (
    Select max(date_column) as maxd from table1
    union 
    Select max(date_column) as maxd from table2
    union 
    ....
) t

手动合并所有表是绝对不可能的。诀窍是使用动态SQL。 说你的表名是表1到表150

Declare @SQL nvarchar(max);
DECLARE @n int = 1;
WHILE (@n <= 150)
BEGIN
SET @SQL = 'SELECT MAX(Date_col) as Max FROM TABLE' + convert(nvarchar(3),@n) + ' UNION '
SET @n += 1
END
SET @SQL = LEFT(@SQL,LEN(@SQL) -6) --Removes the last 'UNION '

EXEC @SQL
Declare@SQL-nvarchar(最大值);
声明@n int=1;

而(@n完全不可能手动合并所有表。诀窍是使用动态SQL。 说你的表名是表1到表150

Declare @SQL nvarchar(max);
DECLARE @n int = 1;
WHILE (@n <= 150)
BEGIN
SET @SQL = 'SELECT MAX(Date_col) as Max FROM TABLE' + convert(nvarchar(3),@n) + ' UNION '
SET @n += 1
END
SET @SQL = LEFT(@SQL,LEN(@SQL) -6) --Removes the last 'UNION '

EXEC @SQL
Declare@SQL-nvarchar(最大值);
声明@n int=1;

而(@n可能有一点动态SQL

很明显,您可以根据自己的需要编辑位置

Declare @SQL varchar(max) ='>>>'

Select @SQL = @SQL +' Union All Select Source   ='''+QuoteName(TABLE_SCHEMA)+'.'
                   +QuoteName(TABLE_NAME)+''',FieldName='''+QuoteName(COLUMN_NAME)+''',Value=max('
                   +QuoteName(COLUMN_NAME)+') From '
                   +QuoteName(TABLE_SCHEMA)+'.'+QuoteName(TABLE_NAME)
 From  INFORMATION_SCHEMA.COLUMNS
 Where COLUMN_NAME Like '%UTC%'
   and DATA_TYPE in ('date','datetime')

Select @SQL=replace(@SQL,'>>> Union All','')
Exec(@SQL)
例如返回

Source                      FieldName   Value
[dbo].[OD]                  [OD-LM-UTC] 2016-11-03 20:28:09.987
[dbo].[zzz-OD_XP]           [XP_LM_UTC] 2016-07-22 22:53:37.113
[dbo].[zzz-OD_OH_Archive]   [OH_LM_UTC] 2016-01-22 15:07:39.077
[dbo].[OD-XP]               [XP-LM-UTC] 2016-11-03 21:28:28.113
[dbo].[USPS-Full]           [LM_UTC]    2016-07-20 15:03:53.600

也许需要一点动态SQL

很明显,您可以根据自己的需要编辑位置

Declare @SQL varchar(max) ='>>>'

Select @SQL = @SQL +' Union All Select Source   ='''+QuoteName(TABLE_SCHEMA)+'.'
                   +QuoteName(TABLE_NAME)+''',FieldName='''+QuoteName(COLUMN_NAME)+''',Value=max('
                   +QuoteName(COLUMN_NAME)+') From '
                   +QuoteName(TABLE_SCHEMA)+'.'+QuoteName(TABLE_NAME)
 From  INFORMATION_SCHEMA.COLUMNS
 Where COLUMN_NAME Like '%UTC%'
   and DATA_TYPE in ('date','datetime')

Select @SQL=replace(@SQL,'>>> Union All','')
Exec(@SQL)
例如返回

Source                      FieldName   Value
[dbo].[OD]                  [OD-LM-UTC] 2016-11-03 20:28:09.987
[dbo].[zzz-OD_XP]           [XP_LM_UTC] 2016-07-22 22:53:37.113
[dbo].[zzz-OD_OH_Archive]   [OH_LM_UTC] 2016-01-22 15:07:39.077
[dbo].[OD-XP]               [XP-LM-UTC] 2016-11-03 21:28:28.113
[dbo].[USPS-Full]           [LM_UTC]    2016-07-20 15:03:53.600
声明@Sql NVARCHAR(max)、@maxid INT、@minid INT、@Runquery VARCHAR(500)
声明@Maxdatefind表(ID INT IDENTITY,Slcmd VARCHAR(max))
SET@Sql='1!'
挑选
''从'+QUOTENAME(表模式)+''中选择最大值(''+列名称+'')作为'+''最大值'+''+列名称+'''''.''''.'+
“输入数据的信息”SCHEMA.COLUMNS(“日期时间”和“日期”)中的QUOTENAME(表名)
'
打印@sql
插入@Maxdatefind(Slcmd)
EXEC(@Sql)
从@Maxdatefind中选择@maxid=max(id),@minid=min(id)
而(@minid
DECLARE@Sql-NVARCHAR(max)、@maxid-INT、@minid-INT、@Runquery-VARCHAR(500)
声明@Maxdatefind表(ID INT IDENTITY,Slcmd VARCHAR(max))
SET@Sql='1!'
挑选
''从'+QUOTENAME(表模式)+''中选择最大值(''+列名称+'')作为'+''最大值'+''+列名称+'''''.''''.'+
“输入数据的信息”SCHEMA.COLUMNS(“日期时间”和“日期”)中的QUOTENAME(表名)
'
打印@sql
插入@Maxdatefind(Slcmd)
EXEC(@Sql)
从@Maxdatefind中选择@maxid=max(id),@minid=min(id)

虽然(@minid-So,你在150个不同的表中有日期类型的字段吗?是的,没错。你能提供一些详细信息,让我们知道你想做什么。似乎大多数人认为你想要一个结果,但你的问题表明每个表可能有一行。所有表的列名都一致吗?那么,你有f吗在150个不同的表中输入日期的字段?是的,没错。你能提供一些详细信息,让我们知道你想做什么。似乎大多数人认为你想要一个结果,但你的问题表明每个表可能只有一行。所有表的列名是否一致?如果它们是一致的,我想你注定要失败像这样的名字我建议使用计数表而不是循环,但在这么少的迭代中不会有任何明显的区别。@SeanLange,我只是用谷歌搜索了一下,它看起来很整洁,我很高兴你发表了评论!这是一篇关于这个主题的优秀文章。这篇文章被称为“t-sql的瑞士军刀”因为它是如此的通用。我想你注定要失败了。如果它们是像这样的统一名称,我建议使用计数表而不是循环,但在这么少的迭代中不会产生任何明显的变化。@SeanLange,我只是在谷歌上搜索了它是什么,它看起来如此整洁,我很高兴你发表了评论!这是一篇关于这个主题的优秀文章。这篇文章是r埃菲尔被誉为“t-sql的瑞士军刀”,因为它用途广泛。