Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблема с не существующим столбцом.  [new]
VitalyB
Member

Откуда: Moscow
Сообщений: 60
Здравствуйте Дамы и Господа!
Имеется таблица:
В одних базах create table qqq (i int, s1 varchar(100))
В других базах create table qqq (i int, s1 varchar(100), s2 varchar(100))

Пытаюсь создать универсальный скрипт:
select case when
(select count(c.object_id)
from sys.columns c
join sys.objects o on c.object_id=o.object_id
where o.name='qqq' and c.name='s2') = 0
then s1 else ISNULL(s2,s1) end
from qqq
where i=584

Получаю ошибку "Invalid column name 's2'." в первых базах, что, наверное, логично.
Но ведь я и горожу весь огород, чтобы проверить существование столбца.

Возможно ли заставить (и как) этот скрипт работать на всех базах?
Привести таблицы к одному виду нельзя по не понятным мне причинам.

Сообщение было отредактировано: 12 мар 12, 11:00
12 мар 12, 10:41    [12229767]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с не существующим столбцом.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
VitalyB,

придётся формировать строку для динамического запроса, я думаю.
Сервер компилирует запрос, не проверяя условие Вашего CASE.
Ему важно, чтобы все упомянутые в запросе поля были в наличии.
12 мар 12, 10:45    [12229794]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с не существующим столбцом.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
VitalyB, почему бы вам не поиспользовать IF?
12 мар 12, 10:51    [12229828]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с не существующим столбцом.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
kDnZP
VitalyB, почему бы вам не поиспользовать IF?
А это поможет?
12 мар 12, 10:55    [12229854]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с не существующим столбцом.  [new]
VitalyB
Member

Откуда: Moscow
Сообщений: 60
iap
Это первое, что мне пришло в голову.
К сожалению результат такой же, но на стадии выполнения.
kDnZP
Т.е. так:
declare @n int
select @n=count(c.object_id)
from sys.columns c
join sys.objects o on c.object_id=o.object_id
where o.name='qqq' and c.name='s2'
if @n = 0
 select s1 from qqq where i=584
else
 select ISNULL(s2,s1) from qqq where i=584

Тот же результат.

Сообщение было отредактировано: 12 мар 12, 11:00
12 мар 12, 10:57    [12229868]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с не существующим столбцом.  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
VitalyB,

Либо используйте динамику, либо создайте в каждой базе view'ы с одинаковой структурой и используйте их.
12 мар 12, 10:58    [12229885]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с не существующим столбцом.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
iap
kDnZP
VitalyB, почему бы вам не поиспользовать IF?
А это поможет?

BEGIN TRAN
CREATE TABLE qqq1 ( i INT, s1 VARCHAR(100) )
CREATE TABLE qqq2 (
    i INT
  , s1 VARCHAR(100)
  , s2 VARCHAR(100) )
GO

IF (
     SELECT COUNT(c.object_id)
     FROM   sys.columns c
     JOIN   sys.objects o
     ON     c.object_id = o.object_id
     WHERE  o.name = 'qqq1'
            AND c.name = 's2'
   ) = 0 
    BEGIN
        SELECT  'qqq1 может'
    END
ELSE 
    BEGIN
        SELECT  'qqq1 не может'
    END
     
IF (
     SELECT COUNT(c.object_id)
     FROM   sys.columns c
     JOIN   sys.objects o
     ON     c.object_id = o.object_id
     WHERE  o.name = 'qqq2'
            AND c.name = 's2'
   ) = 0 
    BEGIN
        SELECT  'qqq2 может'
    END
ELSE 
    BEGIN
        SELECT  'qqq2 не может'
    END
ROLLBACK
12 мар 12, 11:03    [12229925]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с не существующим столбцом.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Дополнение к предыдущему сообщению.

Ну соответственно поиспользовать:
exec('select s1 from qqq where i=584')
или
exec('select ISNULL(s2,s1) from qqq where i=584')

как правильно заметил invm.
12 мар 12, 11:12    [12229978]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с не существующим столбцом.  [new]
VitalyB
Member

Откуда: Moscow
Сообщений: 60
kDnZP
Большое спасибо, работает.
12 мар 12, 11:18    [12230023]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с не существующим столбцом.  [new]
iljy
Member

Откуда:
Сообщений: 8711
VitalyB,

вы реально хренью занимаетесь. Давно бы сделали
alter table qqq add s2 as cast(null as varchar(100))

и забыли.
12 мар 12, 11:58    [12230334]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с не существующим столбцом.  [new]
VitalyB
Member

Откуда: Moscow
Сообщений: 60
iljy
Отличная мысль, но я в первом посту писал:
"Привести таблицы к одному виду нельзя по не понятным мне причинам."
Хотя, если использовать вместо постоянной таблицы времянку, то ...
Спасибо, натолкнули на интересную мысль.
13 мар 12, 15:47    [12240116]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с не существующим столбцом.  [new]
iljy
Member

Откуда:
Сообщений: 8711
VitalyB,

ну хорошо, допустим, что систему писали клинические идиоты и любое изменение схемы таблиц (даже добавление вычисляемого поля) мгновенно эту систему положит. Бывает. Но представление-то вам создать что мешает?
13 мар 12, 15:55    [12240204]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить