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

Откуда:
Сообщений: 14
Есть таблица TableTemp с тремя полями (Field1 [int], Field2 [int], Field3 [int]) как узнать если в таблице поле Field4 [int], если есть вывести значение с этого поля, если ПОЛЯ "Field4" нет вывести "0"?



Спасибо...
6 май 19, 13:45    [21878827]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 902
DogBaks,
Ты же сам написал, что в таблице только 3 поля, и ни одно по названию не похоже на Field4. Значит, поля нет.

Даже скрипты писать не пришлось. Можешь не благодарить.
6 май 19, 14:00    [21878866]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6221
DogBaks,

или через динамику или через IF EXISTS(....) ELSE
6 май 19, 14:00    [21878869]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
Посетитель
Member

Откуда:
Сообщений: 1189
TaPaK
DogBaks,

или через динамику или через IF EXISTS(....) ELSE


с if exists, как я понимаю, тоже только через динамику
ибо при отсутствии поля оно таки не компилируется.
а вот при отсутствии таблицы - пожалуйста.
6 май 19, 14:12    [21878903]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 46688
IF COL_LENGTH(N'ИмяТаблицы', N'ИмяПоля') IS NULL
 PRINT 'Нет такого поля! А может, и таблицы такой нет!';
6 май 19, 14:15    [21878909]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6221
Посетитель
TaPaK
DogBaks,

или через динамику или через IF EXISTS(....) ELSE


с if exists, как я понимаю, тоже только через динамику
ибо при отсутствии поля оно таки не компилируется.
а вот при отсутствии таблицы - пожалуйста.



IF EXISTS SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS ...

или как iap
6 май 19, 14:24    [21878948]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
Посетитель
Member

Откуда:
Сообщений: 1189
TaPaK
Посетитель
пропущено...


с if exists, как я понимаю, тоже только через динамику
ибо при отсутствии поля оно таки не компилируется.
а вот при отсутствии таблицы - пожалуйста.



IF EXISTS SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS ...

или как iap


я немного не про то

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS ... )
  select Field4 from TableName


даст ошибку компиляции при отсутствии поля несмотря на то, что до выполнения кода дело не дойдёт.
чтобы не дало - придется обернуть.
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS ... )
 exec('select Field4 from TableName')
6 май 19, 14:28    [21878958]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6221
Посетитель,

а, ну да
6 май 19, 14:31    [21878966]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 902
Посетитель,
ты от вопрос ТС не уходи.

CREATE TABLE #temp1 ( [field1] INT )
CREATE TABLE #temp2 ( [field2] INT, [field4] INT )
;
DECLARE @tsql NVARCHAR(MAX)
;
SET @tsql = N'
SELECT
  [field1] = [field1],
  [field4] = ' + CASE WHEN COL_LENGTH( 'tempdb..#temp1', 'field4' ) IS NOT NULL THEN '[field4]' ELSE '0' END + '
FROM
  #temp1
'
;
PRINT @tsql
;
SET @tsql = N'
SELECT
  [field1] = [field1],
  [field4] = ' + CASE WHEN COL_LENGTH( 'tempdb..#temp2', 'field4' ) IS NOT NULL THEN '[field4]' ELSE '0' END + '
FROM
  #temp2
'
;
PRINT @tsql
6 май 19, 14:33    [21878978]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
Посетитель
Member

Откуда:
Сообщений: 1189
Руслан Дамирович
Посетитель,
ты от вопрос ТС не уходи.


куда уж мне до вас


Руслан Дамирович
DogBaks,
Ты же сам написал, что в таблице только 3 поля, и ни одно по названию не похоже на Field4. Значит, поля нет.

Даже скрипты писать не пришлось. Можешь не благодарить.
6 май 19, 14:36    [21878986]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 902
Посетитель
куда уж мне до вас

Ничего, батенька, оно с возрастом придет. Доживете-ль-с?
6 май 19, 14:38    [21878992]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 8554
use tempdb;
go

create table dbo.TempTable (f1 int, f2 int, f3 int);
insert into dbo.TempTable
values
 (1, 1, 1), (2, 2, 2), (3, 3, 3);

select
 a.n.value('f1[1]', 'int') as f1,
 a.n.value('f2[1]', 'int') as f2,
 a.n.value('f3[1]', 'int') as f3,
 case when col_length('dbo.TempTable', 'f4') is not null then a.n.value('f4[1]', 'int') else 0 end as f4
from
 (select * from dbo.TempTable for xml path('row'), type) t(x) cross apply
 t.x.nodes('row') a(n);

alter table dbo.TempTable add f4 int;
update top (2) dbo.TempTable set f4 = -1;

select
 a.n.value('f1[1]', 'int') as f1,
 a.n.value('f2[1]', 'int') as f2,
 a.n.value('f3[1]', 'int') as f3,
 case when col_length('dbo.TempTable', 'f4') is not null then a.n.value('f4[1]', 'int') else 0 end as f4
from
 (select * from dbo.TempTable for xml path('row'), type) t(x) cross apply
 t.x.nodes('row') a(n);
go

drop table dbo.TempTable;
go
6 май 19, 14:50    [21879016]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 902
invm
...

Красота!

Посетитель, учись, студент, у маэстро.
6 май 19, 15:23    [21879055]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 902
invm,

только, мне кажется, что COL_LENGTH тут и не нужен, если поля не будет, то и элемента не будет.

select
 a.n.value('f1[1]', 'int') as f1,
 a.n.value('f2[1]', 'int') as f2,
 a.n.value('f3[1]', 'int') as f3,
 ISNULL( a.n.value('f4[1]', 'int'), 0 ) as f4
from
 (select * from dbo.TempTable for xml path('row'), type) t(x) cross apply
 t.x.nodes('row') a(n);
6 май 19, 15:27    [21879058]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
uaggster
Member

Откуда:
Сообщений: 566
Руслан Дамирович, да щаз. А если элемент есть, но в нем NULL?
6 май 19, 15:41    [21879073]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 8554
Руслан Дамирович
только, мне кажется, что COL_LENGTH тут и не нужен, если поля не будет, то и элемента не будет.
Не будет. Только тогда не различить NULL и отсутствие столбца, ибо при NULL элемента тоже не будет.
6 май 19, 15:43    [21879075]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 902
invm
Руслан Дамирович
только, мне кажется, что COL_LENGTH тут и не нужен, если поля не будет, то и элемента не будет.
Не будет. Только тогда не различить NULL и отсутствие столбца, ибо при NULL элемента тоже не будет.

ELEMENTS XSINIL?
6 май 19, 16:10    [21879108]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
DogBaks
Member

Откуда:
Сообщений: 14
Посетитель,

автор
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS ... )
exec('select Field4 from TableName')


Посетитель - спасибо то что нужно (пытался прикрутить через "exec sp_executesql ...") и

"IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS ... )
select Field4 from TableName
"
6 май 19, 16:14    [21879109]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 8554
Руслан Дамирович
ELEMENTS XSINIL?
Не особо поможет - все равно не различить действительное значение NULL в столбце и отсутствие столбца.
6 май 19, 16:49    [21879159]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 902
invm
Руслан Дамирович
ELEMENTS XSINIL?
Не особо поможет - все равно не различить действительное значение NULL в столбце и отсутствие столбца.


SELECT
  a.n.value('f1[1]', 'int') as f1,
  a.n.value('f2[1]', 'int') as f2,
  a.n.value('f3[1]', 'int') as f3,
  a.n.exist('f4[1]' ) AS b,
  CASE 
    WHEN a.n.exist('f4[1]' ) = 0 THEN 0
    ELSE CONVERT( INT, NULLIF( a.n.value('f4[1]', 'VARCHAR(100)' ), '' ) )
  END as f4
from
 (select * from #TempTable for xml path('row'), type, elements xsinil ) t(x) cross apply
 t.x.nodes('row') a(n);

и все же это возможно...
6 май 19, 17:30    [21879213]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
Диклевич Александр
Member

Откуда:
Сообщений: 604
было уже такое:
16946488
6 май 19, 17:41    [21879229]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
PizzaPizza
Member

Откуда:
Сообщений: 222
Буквально каждый раз поражаюсь способности местных старожилов понимать и решать любые задачи. Даже самые ненужные идиотские и заведомо архитектурно ошибочные.
Надеюсь я тоже когда-нибудь стану специалистом, знающим как забить презерватив в куницу.
6 май 19, 18:19    [21879283]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 8554
Руслан Дамирович
и все же это возможно...
Да. Но надо смотреть, что эффективнее.
6 май 19, 18:57    [21879319]     Ответить | Цитировать Сообщить модератору
 Re: Наличие ПОЛЯ в таблице  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 902
PizzaPizza
Буквально каждый раз поражаюсь способности местных старожилов понимать и решать любые задачи. Даже самые ненужные идиотские и заведомо архитектурно ошибочные.
Надеюсь я тоже когда-нибудь стану специалистом, знающим как забить презерватив в куницу.

Я это выразил в первом посте сарказмом.
7 май 19, 10:32    [21879675]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить