Sql server 如何从SQL Server 2000-2008中一组名称中的多个表中选择列名

Sql server 如何从SQL Server 2000-2008中一组名称中的多个表中选择列名,sql-server,sql-server-2008,sql-server-2005,sql-server-2000,Sql Server,Sql Server 2008,Sql Server 2005,Sql Server 2000,如果我有一组这样的名字: ('first', 'fname', 'firstname', 'namef', 'namefirst', 'name') 在SQLServer2000-2008中,为特定数据库检索上述集合中包含列名的不同表名的最佳方法是什么 我想从显示的表列表中排除系统表和临时表 SELECT so.name FROM sysobjects so INNER JOIN syscolumns sc ON so.id = sc.id WHER

如果我有一组这样的名字:

('first', 'fname', 'firstname', 'namef', 'namefirst', 'name')
在SQLServer2000-2008中,为特定数据库检索上述集合中包含列名的不同表名的最佳方法是什么

我想从显示的表列表中排除系统表和临时表

SELECT so.name
FROM   sysobjects so
       INNER JOIN syscolumns sc
            ON  so.id = sc.id
WHERE  sc.name IN ('first', 'fname', 'firstname', 'namef', 'namefirst', 'name')
我相信这是它的衍生物

Thx

您可以使用信息模式

我不记得这是否包括临时表,但您可以查看表中的其他列以查看要过滤的内容。

您可以使用信息模式

我不记得这是否包括临时表,但您可以查看表中的其他列以查看要筛选的内容。

适用于SQL Server 2005及更高版本 FWIW对于较新版本的SQL Server,我更喜欢目录视图而不是信息模式,原因如下:

另请参见MSDN主题中的类似警告:

不要使用信息模式视图来确定对象的模式。查找对象架构的唯一可靠方法是查询sys.objects目录视图。架构视图的信息可能不完整,因为它们没有针对所有新功能进行更新

因此,我将使用的查询如下:过滤掉系统对象,并且在使用tempdb时避免使用temp表:

SELECT t.name, c.name
  FROM sys.tables AS t
  INNER JOIN sys.columns AS c
  ON t.[object_id] = c.[object_id]
  WHERE c.name IN (N'name', N'firstname', etc.)
  AND t.is_ms_shipped = 0
  AND t.name NOT LIKE '#%';
SELECT [object] = so.name, [column] = sc.name, 
  [type]  = st.name,   [precision] = st.xprec, 
  [scale] = st.xscale, st.length
FROM sysobjects AS so
INNER JOIN syscolumns AS sc
ON  so.id = sc.id
INNER JOIN systypes AS st
ON sc.xtype = st.xtype
WHERE sc.name IN 
  (N'first', N'fname', N'firstname', N'namef', N'namefirst', N'name')
AND so.name NOT LIKE '#%'
AND OBJECTPROPERTY(so.id, 'IsMsShipped') = 0;
要对所有数据库重复此操作,请执行以下操作:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
  UNION ALL SELECT db = N''' + name + ''', 
    t.name COLLATE Latin1_General_CI_AI, 
    c.name COLLATE Latin1_General_CI_AI
  FROM ' + QUOTENAME(name) + '.sys.tables AS t
  INNER JOIN ' + QUOTENAME(name) + 'sys.columns AS c
  ON t.[object_id] = c.[object_id]
  WHERE c.name IN (N''name'', N''firstname'', etc.)
  AND t.is_ms_shipped = 0
  AND t.name NOT LIKE ''#%'''
FROM sys.databases
-- WHERE ... -- probably don't need system databases at least

SELECT @sql = STUFF(@sql, 1, 18, '') 
  -- you may have to adjust  ^^ 18 based on copy/paste, cr/lf, tabs etc.
  + ' ORDER BY by db, s.name, o.name';

EXEC sp_executesql @sql;
COLLATE子句用于在数据库具有不同排序规则的情况下防止错误

适用于SQL Server 2000 请注意,上述内容对SQLServer2000没有帮助,但我认为您不应该将能够在每个版本上运行相同的查询作为目标。SQLServer2000已经有13年的历史了,已经有好几年没有支持了;当然,您可以证明为它使用特殊代码是合理的。在这种情况下,我仍然会选择您对信息模式的查询,只需再次过滤掉系统对象和临时表,仅与您在tempdb中的事件相关:

SELECT t.name, c.name
  FROM sys.tables AS t
  INNER JOIN sys.columns AS c
  ON t.[object_id] = c.[object_id]
  WHERE c.name IN (N'name', N'firstname', etc.)
  AND t.is_ms_shipped = 0
  AND t.name NOT LIKE '#%';
SELECT [object] = so.name, [column] = sc.name, 
  [type]  = st.name,   [precision] = st.xprec, 
  [scale] = st.xscale, st.length
FROM sysobjects AS so
INNER JOIN syscolumns AS sc
ON  so.id = sc.id
INNER JOIN systypes AS st
ON sc.xtype = st.xtype
WHERE sc.name IN 
  (N'first', N'fname', N'firstname', N'namef', N'namefirst', N'name')
AND so.name NOT LIKE '#%'
AND OBJECTPROPERTY(so.id, 'IsMsShipped') = 0;
您也可以对SQL Server 2000中的每个数据库执行此操作,但由于您不能使用NVARCHARMAX,因此您必须使用游标、一组变量或SQL Server 2005及更高版本的。

FWIW对于较新版本的SQL Server,我更喜欢目录视图而不是信息模式,原因如下:

另请参见MSDN主题中的类似警告:

不要使用信息模式视图来确定对象的模式。查找对象架构的唯一可靠方法是查询sys.objects目录视图。架构视图的信息可能不完整,因为它们没有针对所有新功能进行更新

因此,我将使用的查询如下:过滤掉系统对象,并且在使用tempdb时避免使用temp表:

SELECT t.name, c.name
  FROM sys.tables AS t
  INNER JOIN sys.columns AS c
  ON t.[object_id] = c.[object_id]
  WHERE c.name IN (N'name', N'firstname', etc.)
  AND t.is_ms_shipped = 0
  AND t.name NOT LIKE '#%';
SELECT [object] = so.name, [column] = sc.name, 
  [type]  = st.name,   [precision] = st.xprec, 
  [scale] = st.xscale, st.length
FROM sysobjects AS so
INNER JOIN syscolumns AS sc
ON  so.id = sc.id
INNER JOIN systypes AS st
ON sc.xtype = st.xtype
WHERE sc.name IN 
  (N'first', N'fname', N'firstname', N'namef', N'namefirst', N'name')
AND so.name NOT LIKE '#%'
AND OBJECTPROPERTY(so.id, 'IsMsShipped') = 0;
要对所有数据库重复此操作,请执行以下操作:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
  UNION ALL SELECT db = N''' + name + ''', 
    t.name COLLATE Latin1_General_CI_AI, 
    c.name COLLATE Latin1_General_CI_AI
  FROM ' + QUOTENAME(name) + '.sys.tables AS t
  INNER JOIN ' + QUOTENAME(name) + 'sys.columns AS c
  ON t.[object_id] = c.[object_id]
  WHERE c.name IN (N''name'', N''firstname'', etc.)
  AND t.is_ms_shipped = 0
  AND t.name NOT LIKE ''#%'''
FROM sys.databases
-- WHERE ... -- probably don't need system databases at least

SELECT @sql = STUFF(@sql, 1, 18, '') 
  -- you may have to adjust  ^^ 18 based on copy/paste, cr/lf, tabs etc.
  + ' ORDER BY by db, s.name, o.name';

EXEC sp_executesql @sql;
COLLATE子句用于在数据库具有不同排序规则的情况下防止错误

适用于SQL Server 2000 请注意,上述内容对SQLServer2000没有帮助,但我认为您不应该将能够在每个版本上运行相同的查询作为目标。SQLServer2000已经有13年的历史了,已经有好几年没有支持了;当然,您可以证明为它使用特殊代码是合理的。在这种情况下,我仍然会选择您对信息模式的查询,只需再次过滤掉系统对象和临时表,仅与您在tempdb中的事件相关:

SELECT t.name, c.name
  FROM sys.tables AS t
  INNER JOIN sys.columns AS c
  ON t.[object_id] = c.[object_id]
  WHERE c.name IN (N'name', N'firstname', etc.)
  AND t.is_ms_shipped = 0
  AND t.name NOT LIKE '#%';
SELECT [object] = so.name, [column] = sc.name, 
  [type]  = st.name,   [precision] = st.xprec, 
  [scale] = st.xscale, st.length
FROM sysobjects AS so
INNER JOIN syscolumns AS sc
ON  so.id = sc.id
INNER JOIN systypes AS st
ON sc.xtype = st.xtype
WHERE sc.name IN 
  (N'first', N'fname', N'firstname', N'namef', N'namefirst', N'name')
AND so.name NOT LIKE '#%'
AND OBJECTPROPERTY(so.id, 'IsMsShipped') = 0;

您也可以对SQL Server 2000中的每个数据库执行此操作,但由于您不能使用NVARCHARMAX,因此您必须使用光标、一组变量或。

如何确定是否只有特定数据库才存在列名?此脚本将只返回连接所针对的数据库的结果。你可以给信息加前缀。。。使用DBNAME。如何确定列名是否仅存在于特定数据库中?此脚本将仅返回连接所针对的数据库的结果。你可以给信息加前缀。。。使用DBNAME。您可以更新SQL Server 2000查询以显示列的数据类型吗?@Lijo好的,您必须计算nvarchar的长度/2,将数字类型的精度/比例放在一起,等等。我也没有满足用户定义的类型…谢谢。。。这个查询非常有效。。你在使用某种SQL工具吗?您是如何在这样一个旧的数据库服务器上找到正确的语法的?[我知道你是SQL Server的高手。仍然不知道有什么东西可以测试这个。]@Lijo我有一个虚拟机,有2000 RTM&SP4、2005 RTM&SP4、2008 RTM&SP3、2008 R2 RTM&SP2、2012 RTM&SP1和几种2014 Beta。在一个特定的版本上重新编程就像启动一个服务一样简单。你能更新SQL Server 2000查询以显示列的数据类型吗?@Lijo好的,你必须计算出nvarchar的长度/2,
将数字类型的精度/比例放在一起,等等。我也没有迎合用户定义的类型…谢谢。。。这个查询非常有效。。你在使用某种SQL工具吗?您是如何在这样一个旧的数据库服务器上找到正确的语法的?[我知道你是SQL Server的高手。仍然不知道有什么东西可以测试这个。]@Lijo我有一个虚拟机,有2000 RTM&SP4、2005 RTM&SP4、2008 RTM&SP3、2008 R2 RTM&SP2、2012 RTM&SP1和几种2014 Beta。在特定构建上重新编程与启动服务一样简单。