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
。
答案 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的代码。