Что мне не хватает в этом TSQL (как оператор)? - PullRequest
1 голос
/ 01 августа 2011
select c.* 
from syscolumns c join sysobjects o on o.id=c.id and o.name = 'orders'

возвращает

Id
Customer
Product
03-28-2011
04-04-2011
04-11-2011
04-18-2011

Это правильно.Но я хочу только столбцы, которые соответствуют шаблону 99-99-9999.Поэтому я попробовал это where cast(o.name as varchar) like '%-%-%', которое не дало никаких результатов.Тогда я попробовал это: where cast(o.name as varchar) like 'P%' (я ожидал получить «Продукт»), и он также ничего не возвращал.Зачем???Какой синтаксис я должен использовать, чтобы получить столбцы, которые являются «датами»?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 01 августа 2011

За каждую часть вашего вопроса ...

Соответствие шаблону даты

Вы можете использовать [0-9] для указания диапазонов.

Так что для 99-99-9999 у вас будет

LIKE '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]'

Для дат вы также можете использовать ISDATE или подобные вещи для дальнейшего ограничения

LIKE '[0-1][0-9]-[0-3][0-9]-2[0-9][0-9][0-9]'

Фильтры столбцов

Эти условия никогда не могут быть истинными, потому что они все на o.name

o.name = 'orders'

и

cast(o.name as varchar) like '%-%-%'
cast(o.name as varchar) like 'P%'

Последние 2 должны быть на c.name в вашем запросе

Наконец

Используйте более новые sys.columns и sys.objects. Или INFORMATION_SCHEMA.COLUMNS, что, вероятно, лучше всего здесь

0 голосов
/ 01 августа 2011

Вы применяете к varchar без указания длины.Я полагаю, что по умолчанию установлено значение 1, которое объясняет проблему.

Укажите длину в операторе приведения следующим образом.

varchar(50)

Редактировать: Нет. Значение по умолчанию для приведения и преобразования - 30.

http://msdn.microsoft.com/en-us/library/ms176089.aspx

...