2015-03-31 4 views
1

Я получаю сообщение об ошибке при выполнении запроса ниже. что я делаю неправильно?Пожалуйста, помогите мне исправить ошибку синтаксиса

Msg 512, уровень 16, состояние 1, строка 3 Подзапрос возвратил более 1 значения. Это недопустимо, когда подзапрос следует =,! =, <, < =,>,> = или когда подзапрос используется как выражение.

select 

    so.name 'Table Name' 
    ,so.id 'Table ID' 
    ,so.xtype 
    ,sc.name 'Column Name' 
    ,sc.id 'Column ID' 
    ,sf.constid 
    ,sf.fkeyid 'Object ID of the table with FOREIGN KEY' 
    ,sf.rkeyid 'Referenced Table ID' 
    ,(select o.name 'Referenced Table' 
    from sysforeignkeys f 
    inner join sysobjects o 
     on o.id=f.rkeyid 
     where o.xtype='U') 

    from sysobjects so 
    inner join syscolumns sc 
    on so.id=sc.id 
     inner join sysforeignkeys sf 
    on so.id=sf.fkeyid 
    where so.xtype='U' 
    and (sc.name like 'SSN' 
    OR sc.name LIKE 'ssn%'   
    OR sc.name LIKE 'ssn%'   
     OR sc.name LIKE '%_ssn%'   
    OR sc.name LIKE '_ocsecno'   
    OR sc.name LIKE 'Ssn%'); 
+1

как "ССНО = либо использовать LIKE или =, как будет вызывать пробы –

+0

Название может быть улучшена – rpax

ответ

1

Я не думаю, что ваш подзапрос является правильным, так как не имеет возможности представить вашу sysobjects псевдонимами «так». Попробуйте это вместо этого. Кроме того, я не думаю, что вам нужна такая длинная фраза.

select so.name  [Table Name] 
     ,so.id  [Table ID] 
     ,so.xtype 
     ,sc.name [Column Name] 
     ,sc.id  [Column ID] 
     ,sf.constid 
     ,sf.fkeyid [Object ID of the table with FOREIGN KEY] 
     ,sf.rkeyid [Referenced Table ID] 
     ,zz.name [Reference Table] 
from sysobjects so 
inner join syscolumns sc  on so.id = sc.id 
inner join sysforeignkeys sf on so.id = sf.fkeyid 

--Use a join here for the reference table column 
inner join sysobjects zz  on zz.id = sf.rkeyid 

where so.xtype='U' 
     AND(
      sc.name LIKE '%ssn%' 
      OR sc.name LIKE '_ocsecno' 
      ) 
+0

У меня был msg 4104, когда я попробовал вашу версию. Msg 4104, уровень 16, состояние 1, строка 1 Идентификатор из нескольких частей «zz.id» не может быть связан. Msg 4104, уровень 16, состояние 1, строка 1 Идентификатор с несколькими частями «zz.name» не может быть связан. – user3561219

+0

Является ли ваш регистр SQL Server чувствительным к регистру? – Stephan

+1

есть. Большое спасибо за помощь. он работает сейчас. – user3561219

1
select so.name  [Table Name] 
     ,so.id  [Table ID] 
     ,so.xtype 
     ,sc.name [Column Name] 
     ,sc.id  [Column ID] 
     ,sf.constid 
     ,sf.fkeyid [Object ID of the table with FOREIGN KEY] 
     ,sf.rkeyid [Referenced Table ID] 
     ,(select TOP 1 o.name 
      from sysforeignkeys f 
      inner join sysobjects o on o.id=f.rkeyid 
      where o.xtype='U') AS [Referenced Table] 
from sysobjects so 
inner join syscolumns sc  on so.id = sc.id 
inner join sysforeignkeys sf on so.id = sf.fkeyid 
where so.xtype='U' 
    and ( sc.name like 'SSN' --<-- Two operator together "LIKE" and "=" 
     OR sc.name LIKE 'ssn%'   
     OR sc.name LIKE 'ssn%'   
     OR sc.name LIKE '%_ssn%'   
     OR sc.name LIKE '_ocsecno'   
     OR sc.name LIKE 'Ssn%'); 

Важное примечание

Суб-запрос в Select должен возвращать скалярное значение, добавьте TOP 1 к вашему подзапроса, и он должен исправить ошибку.

Также используйте квадратные скобки [] для имен столбцов вместо литеральных строк.

+0

хороший вызова. исправлено, но я все еще получаю сообщение об ошибке Msg 512, уровень 16, состояние 1, строка 3 Подзапрос возвратил более 1 значения. Это недопустимо, когда подзапрос следует =,! =, <, <= , >,> = или когда подзапрос используется как выражение. – user3561219

+1

Хорошо, что Али +1. – Rahul

+0

@ user3561219 посмотреть, я отредактировал свой ответ и исправил проблему, которую вы сейчас получаете. –

1

Проблема заключается в вашей where статье

..... 
where so.xtype='U' 
    and (sc.name like 'SSN' -- Here you have a unwanted = or sc.name = 'SSN' 
    OR sc.name LIKE 'ssn%'   
    OR sc.name LIKE 'ssn%'   
     OR sc.name LIKE '%_ssn%'   
    OR sc.name LIKE '_ocsecno'   
    OR sc.name LIKE 'Ssn%');