通过密钥选择来自非规范化数据库的所有相关记录

时间:2014-06-02 14:42:54

标签: sql sql-server denormalization

我正在使用SQL Server 2012.我只能访问一个没有任何关系的数据库。我对SQL脚本了解不多。我想从具有列EmployeeID的所有表中查看与EmployeeID 102关联的所有记录。例如。

EmployeeID    LastName     FirstName   (from table Employees)
102           Jonh         Smith
EmployeeID    HireDate                 (from table EmploymentRecords)
102           2/1/2014
EmployeeID    Monthly Salary           (from table Salary)
102           2000
and so on

我尝试了以下脚本,但结果窗口关闭,在消息窗口中它只是说“命令已成功完成”。我怎样才能得到上述结果。提前谢谢。

DECLARE tnames_cursor CURSOR
FOR
  SELECT TABLE_NAME 
  FROM INFORMATION_SCHEMA.TABLES
OPEN tnames_cursor
DECLARE @tablename sysname
FETCH NEXT FROM tnames_cursor INTO @tablename

if (select count(*) from information_schema.columns where  table_name = @tablename and     Column_name ='EmployeeID') > 0

BEGIN   

  SELECT @tablename = RTRIM(@tablename) 
  EXEC ('SELECT *  FROM '+ @tablename +'where  EmployeeID = 102')
END

2 个答案:

答案 0 :(得分:2)

这句话可能会阻止一切工作:

EXEC ('SELECT *  FROM '+ @tablename +'where  EmployeeID = 102')

表名后需要一个空格:

EXEC ('SELECT *  FROM '+ @tablename +' where  EmployeeID = 102')

此外,您的光标逻辑似乎已关闭。您应该检查@@FETCH_STATUS,然后关闭并取消分配光标。

按照documentation

末尾的示例进行操作

答案 1 :(得分:1)

基本上,当前问题是您没有循环遍历整个结果集。

DECLARE tnames_cursor CURSOR
FOR
  SELECT TABLE_NAME 
  FROM INFORMATION_SCHEMA.TABLES
OPEN tnames_cursor
DECLARE @tablename sysname
FETCH NEXT FROM tnames_cursor INTO @tablename

while @@FETCH_STATUS=0
begin

    if (select count(*) from information_schema.columns where  table_name = @tablename and     Column_name ='EmployeeID') > 0
    begin

        SELECT @tablename = RTRIM(@tablename) 
        EXEC ('SELECT *  FROM '+ @tablename +'where  EmployeeID = 102')
    end


    FETCH NEXT FROM tnames_cursor INTO @tablename
end
close tnames_cursor
deallocate tnames_cursor