我可以将sys.columns加入他们的数据吗?

时间:2014-05-15 20:22:59

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

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,但这要求join采用(明显)不起作用的格式:

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

我还能做些什么吗?我的最终目标是更新{em>所有表中所有行的EmployeeID

2 个答案:

答案 0 :(得分:2)

如上所述,这不能像您想象的那样完成,因为数据存储在表中,而目录视图(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

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

答案 1 :(得分:0)

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

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