【问题标题】:Can I join sys.columns to their data?我可以将 sys.columns 加入他们的数据吗?
【发布时间】:2014-05-15 20:22:58
【问题描述】:

Pinal Dave 拥有this neat query,他在其中找到了他数据库中所有表中名为EmployeeID 的所有列:

select t.name as table_name,
    schema_name(schema_id) as schema_name,
    c.name as column_name
from sys.tables as t
inner join sys.columns c on t.object_id = c.object_id
where c.name like '%EmployeeID%'
order by schema_name, table_name;

有没有办法将该数据连接到匹配列中的数据

我尝试添加一个额外的 join 并查看其他 sys.* 项目,看看其中一个听起来是否像是数据。

我也尝试围绕这个构建一个外部select,但这要求joins 的格式(显然)不起作用:

select ( /* above */ ) as foo
inner join foo.table_name bar on bar.something = foo.something --???

还有什么我可以做的吗?我的最终目标是为所有表中的所有行更新EmployeeID

【问题讨论】:

  • 不是没有动态SQL
  • 表格本身就是数据。

标签: sql sql-server sql-server-2008 join


【解决方案1】:

如前所述,这不能像您想象的那样完成,因为数据存储在表中,并且目录视图 (sys.) 包含有关数据库对象的信息。

您可以使用游标和动态 sql 实现您的目标:

DECLARE @col VARCHAR(MAX)
       ,@table VARCHAR(MAX)
       ,@schema VARCHAR(MAX)
       ,@strSQL VARCHAR(MAX)
DECLARE xyz CURSOR
FOR
        SELECT c.name
              ,t.name
              ,s.name
        FROM sys.tables t
        JOIN sys.columns c
         ON t.object_ID = c.object_ID
        JOIN sys.schemas s
         ON t.schema_id = s.schema_id
        WHERE c.name LIKE '%EmployeeID%';    
OPEN xyz 
FETCH NEXT FROM xyz 
INTO @col,@table,@schema 
WHILE @@FETCH_STATUS = 0
BEGIN

SET @strSQL = 
'UPDATE '+@schema+'.'+@table+' 
 SET '+@col+' = ''Something''
'
PRINT (@strSQL)

    FETCH NEXT FROM xyz 
    INTO @col,@table,@schema 
END
CLOSE xyz 
DEALLOCATE xyz 
GO

在通过EXEC 实际运行之前使用PRINT 命令测试动态sql 是个好主意。

【讨论】:

    【解决方案2】:

    不,你不能以你想要的方式。

    尝试编写生成 T-SQL 的代码,例如 LINQPad。或者在 T-SQL 本身中编写生成动态 SQL 的代码。

    【讨论】:

      猜你喜欢
      • 2013-05-03
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 2019-12-06
      • 1970-01-01
      • 2011-09-10
      相关资源
      最近更新 更多