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

Откуда:
Сообщений: 42
Приветствую.
Имеется ряд запросов, в которых участвуют табличные переменные с кучей полей.
Мне надо проверить все поля во всех строках на предмет наличия пустой строки и заменить это дело null.
Писать тучу update не хочется. Нет ли какого курсора по полям таблицы?
25 май 11, 18:01    [10708819]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
AlexPiter
Имеется ряд запросов, в которых участвуют табличные переменные с кучей полей.
Картина маслом. Но представить тяжело.
Перевожу на руский язык:
Есть куча говнокода. Как заговнокодить чтоб не думать и не тратить время.
Правильно перевёл?
Если нет, значит плохо описали.

AlexPiter
Мне надо проверить все поля во всех строках на предмет наличия пустой строки и заменить это дело null.
Выявить болезнь: В описании полей Replace-ом (RegEx) добавить CHECK ({Column} != '').
А дальше лечить народными методами.
25 май 11, 18:24    [10708941]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
Glory
Member

Откуда:
Сообщений: 104751
AlexPiter
Писать тучу update не хочется. Нет ли какого курсора по полям таблицы?

Напишите один update. Одна команда update может обновлять сколь угодно много полей
26 май 11, 09:50    [10711045]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
AlexPiter
Member

Откуда:
Сообщений: 42
На счет говнокода, не вам решать. Вы его не видели.
Разъясню. Для генерации XML определенного формата создается табличная переменная и в нее заносятся различные данные. Таких табличных переменных 5 штук разных, т.к. имеется 5 разных видов XML.
Я занес в них большое количество данных. И отправил на валидацию тем, кому они предназначаются.
А эти, не очень хорошие люди, заявили, что теги типа <SupplierItemCode/>, что обозначает пустой тег, не правильно обрабатываются их парсером. Отсюда надо заменять пустые строки на null, чтобы не генерировались пустые теги. Лезть в заполнения не хочется, т.к. там уже всё корректно настроено.
Т.е. мне надо пройтись по всей таблице, как в нормальных языках программирования по 2-х мерному массиву, и если я там вижу '', то заменять это на null.
Писать что-то из серии
update @t1
set f1=(case when f1='' then null else f1 end)

для 500 полей мне банально лень. Поэтому и возник такой вопрос:
Как обратиться ко всем столбцам таблицы по индексу???
Нельзя что-ли?
27 май 11, 10:04    [10717399]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
Glory
Member

Откуда:
Сообщений: 104751
AlexPiter
Нельзя что-ли?

Лениться - точно нельзя
У полей таблиц нет никаких индексов
27 май 11, 10:07    [10717431]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
AlexPiter
Писать что-то из серии
 update @t1
 set f1=(case when f1='' then null else f1 end)
для 500 полей мне банально лень.

Можно облегчить твои страдания чем-то из серии
 update @t1
 set f1=NULLIF(f1,'')
+ У тебя же есть где-то описание табличной переменной? Тогда волшебное сочетание клавиш Alt+Shift+какая-нибудь стрелка помогут добиться такого выделения:
DECLARE @t1 TABLE(
    f1 VARCHAR(255)
   ,f2 VARCHAR(255)
   ,f3 VARCHAR(255)
   ,f4 VARCHAR(255)
   ,f5 VARCHAR(255)
Ну а дальше копи-паст...
ЗЫ Но лучше всего сделать так, как советуют, либо засунуть NULLIF в запрос на выборку, либо убрать из запроса ISNULL, если он там есть.
27 май 11, 10:25    [10717545]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
+ AlexPiter
AlexPiter
На счет говнокода, не вам решать. Вы его не видели.
Не дай бог мне его ещё и видеть.
AlexPiter
создается табличная переменная
Зачем?
AlexPiter
переменных 5 штук разных
Как много, ужас.
AlexPiter
А эти, не очень хорошие люди, заявили, что теги типа <SupplierItemCode/>, что обозначает пустой тег, не правильно обрабатываются их парсером.
Возму на заметку как надо посылать.
AlexPiter
Отсюда надо заменять пустые строки на null
Откуда они вообще взялись а БД? Вот в чём вопрос.
AlexPiter
Лезть в заполнения не хочется
Вы правы проблема не в заполнении а в допуске попадания в БД.
AlexPiter
update @t1 set f1=(case when f1='' then null else f1 end)
Есть ещё 100500 методов занять систему ерундой.
AlexPiter
мне банально лень.
Корень всех бед.
AlexPiter
Нельзя что-ли?
Нет.
27 май 11, 10:43    [10717679]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Guf, вы в отличие от ТС не лентяй. Одно лишь упоминание Alt+Shift об этом говорит.
27 май 11, 10:52    [10717777]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
AlexPiter
Member

Откуда:
Сообщений: 42
Правильно говорят:
На американском форуме задаешь вопрос - получаешь ответ.
На израильском задаешь вопрос - тебе тоже задают вопрос.

А тут тебе сначала долго объясняют какой ты му**к, а потом посылают в ... или на .... :-)

Я бы этот SQL в глаза б не видел, а сформировал бы всё в нормальном языке программирования.
Но ТЗ говорит обратное.
Единственное спасибо могу сказать за nullif, не знал такой штуки, всё остальное обыкновенный флуд кучи людей гнущих пальцы друг перед другом.
27 май 11, 15:56    [10720920]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
Glory
Member

Откуда:
Сообщений: 104751
AlexPiter
А тут тебе сначала долго объясняют какой ты му**к, а потом посылают в ... или на .... :-)

Вы только на американском форуме не забудьте сказать "мне банально лень" это делать
27 май 11, 15:58    [10720950]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
AlexPiter
Member

Откуда:
Сообщений: 42
Ну что-же, пофлудим.
Я давно считаю, что надо писать как можно менее привязано к конкретным данным. Эту штуку, про которую я спрашивал, и которая реализуется на языке типа С++ в 3 строки, мне надо будет использовать на нескольких разных табличных переменных, и в таком случае первой мыслью было написать что-нибудь универсальное для всех. Может на счет банально лень я несовсем корректно выразился.
Я считаю некорректным делать обработку тупо по назвниям полей, но если в SQL нельзя шататься по таблице по индексам, то это жирный минус языку sql, и буду в понедельник тупа переписывать 500 полей вместо 3-х строчек...
27 май 11, 16:56    [10721548]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
AlexPiter, некоторые мифы так сладки.
27 май 11, 16:58    [10721583]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
AlexPiter
то это жирный минус языку sql
Это офигитительный плюс. Всё г**вно всплывает наружу.
Экономишь на спичках и не видишь глобальную проблему, вон из профессии
, не можешь спроектировать нормально систему, вон из профессии
, не можешь декларативно мыслить, опять вон из профессии.

Принцип "палки в колёса" (ограничения) это уже реалии без которых нельзя нормально всё это мировое барахло поддерживать.
27 май 11, 17:06    [10721640]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
Glory
Member

Откуда:
Сообщений: 104751
AlexPiter
Я считаю некорректным делать обработку тупо по назвниям полей, но если в SQL нельзя шататься по таблице по индексам, то это жирный минус языку sql, и буду в понедельник тупа переписывать 500 полей вместо 3-х строчек...

Я думаю, что Microsoft заранее готовился к такой диверсии против вас
А заодно и создатели SQL
27 май 11, 17:09    [10721671]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
iljy
Member

Откуда:
Сообщений: 8711
AlexPiter
Ну что-же, пофлудим.
Я давно считаю, что надо писать как можно менее привязано к конкретным данным. Эту штуку, про которую я спрашивал, и которая реализуется на языке типа С++ в 3 строки, мне надо будет использовать на нескольких разных табличных переменных, и в таком случае первой мыслью было написать что-нибудь универсальное для всех. Может на счет банально лень я несовсем корректно выразился.
Я считаю некорректным делать обработку тупо по назвниям полей, но если в SQL нельзя шататься по таблице по индексам, то это жирный минус языку sql, и буду в понедельник тупа переписывать 500 полей вместо 3-х строчек...

Ну что же, пофлудим. Нормальные люди вместо 500 столбцов делают 500 строк и наслаждаются прелестями обработки множеств одной командой. А на американских форумах народ еще и политкорректный, их с детства учат вместо "идиот" говорить "представитель интеллектуального большинства".
27 май 11, 19:23    [10722506]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
PlayWsql
Member

Откуда:
Сообщений: 8
DECLARE @colName varchar(max)
DECLARE @ExecMe nvarchar(max)

SET @ExecMe = ''
SET @colName = ''

DECLARE vendor_cursor CURSOR FOR
SELECT
ac.name
FROM
sys.objects AS ob
INNER JOIN sys.all_columns AS ac ON ac.object_id = ob.object_id
WHERE
ob.name = 'tblUpMe'

OPEN vendor_cursor

FETCH NEXT FROM vendor_cursor
INTO @colName

WHILE @@FETCH_STATUS = 0
BEGIN

SET @ExecMe = @ExecMe +
'
UPDATE tblUpMe
SET
' + @colName + ' = Ваше значение
WHERE
' + @colName + ' = Ваше условие
'

FETCH NEXT FROM vendor_cursor
INTO @colName
END
CLOSE vendor_cursor
DEALLOCATE vendor_cursor

PRINT @ExecMe

--EXEC(@ExecMe)



Результат следущий

UPDATE tblUpMe
SET
col1 = Ваше значение
WHERE
col1 = Ваше условие

UPDATE tblUpMe
SET
col2 = Ваше значение
WHERE
col2 = Ваше условие

UPDATE tblUpMe
SET
col3 = Ваше значение
WHERE
col3 = Ваше условие
29 май 11, 00:42    [10726012]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
PlayWsql
Member

Откуда:
Сообщений: 8
Если нужно еще и Up 500 tbl то курсор в курсоре и sys. вам помощь
29 май 11, 00:47    [10726027]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
iljy
Member

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

вы злой, ни сервер, ни себя не любите
declare @sql varchar(max)
SET @sql = 'UPDATE tblUpMe SET '+
STUFF((SELECT ','+QUOTENAME(ac.name)+ ' = Ваше значение
'
FROM
sys.objects AS ob
INNER JOIN sys.all_columns AS ac ON ac.object_id = ob.object_id
WHERE ob.object_id = OBJECT_ID('Data')
FOR XML PATH(''),TYPE).value('.','varchar(max)'),1,1,'')

print(@sql)
29 май 11, 01:08    [10726064]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
PlayWsql
Member

Откуда:
Сообщений: 8
Спасибо за пример, но я показал возможность бегать по столбцам, а сервер не мой ведь ;)
29 май 11, 01:23    [10726116]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
PlayWsql
Member

Откуда:
Сообщений: 8
to iljy

Кстати немного готов поспорить о подходе, если строка будет LEN(строка) > 8000
то она урежиться. поэтому выход будет Set @строка + 'строка' , что не приведет к ошибке при EXEC, конечно если урежится в нужном месте то ошибки не будет, но это можно проворонить.. )
29 май 11, 01:46    [10726191]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
PlayWsql
Member

Откуда:
Сообщений: 8
Уже не готов поспорить, с FOR XML PATH('') отрабатывает корректно)
29 май 11, 02:34    [10726266]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
iljy
Member

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

на тип переменной посмотрите внимательно.
29 май 11, 11:04    [10726579]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
PlayWsql
Member

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

Вы меня извените, может я чегото не монимаю, но

DECLARE @str varchar(max)
SET @str = 'длинна более 8000'
SELECT LEN(@str) 
RESULT - 8000

и второй подход

Set @str = 'длинна 8000'
Set @str = @str + 'длинна 8000'
SELECT LEN(@str) 
RESULT - 16000

-Именно на этом я делал акцент, но с FOR XML PATH('') обрезается только если строка одной выборки больше 8000, а не вся все выборка в целом. тк название поля не будет больше 8000 то конечно ваш способ куда лучше.

И собственно вопрос) причем тут varchar(max)? для конкретного случая.. =)
29 май 11, 23:10    [10728335]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
PlayWsql
Member

Откуда:
Сообщений: 8
Странно, это верно если писать
Set @str = 'строка' + 'строка' + 'строка', где 'строка'+'строка'+'строка' >8000
SELECT LEN(@str)
RESULT 8000
Вчем подвох?
29 май 11, 23:24    [10728390]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по всем полям табличной переменной.  [new]
iljy
Member

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

подвох - в голове ;)))

declare @s1 varchar(max),@s2 varchar(max)
select @s1 = REPLICATE('1234567890', 1000),
	@s2 = REPLICATE(cast('1234567890' as varchar(max)), 1000)
select LEN(@s1) s1, LEN(@s2) s2
30 май 11, 01:01    [10728666]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить