2015-11-04 3 views
1

У меня есть стол с 80 столбцами. Из которых 60 столбцов - это числовое поле. Я хотел бы проверить, если значение столбцов номер или не я могу сделать это с помощьюИспользование Isnumeric с wild card в SQL Server

SELECT * FROM IPP where isnumeric(2009)=1 

2009 этого имя столбца

Есть ли способ я могу использовать джокер %200% в IsNumeric т.е.

isnumeric('%200%') 

из-у меня есть около 60 колонки года, и эти колонки собираются увеличить за время

Я пытаюсь это

SELECT * FROM IPP where isnumeric('%2009%')=1 

Возможно ли это?

+0

Нет. Но вы можете написать динамический SQL, который сделает это за вас. Вот старт: http://stackoverflow.com/questions/20463365/looping-through-column-names-with-dynamic-sql Начните с этого и отправляйте назад, если вы застряли. –

+3

1. Ваша модель данных кажется очень плохим. Новые данные никогда не должны приводить к новым столбцам, а только к новым строкам. (I.e. вы хотите добавить * данные * не изменять * структуру данных *.) 2. 2009 - плохое имя столбца. Вы не должны использовать числа в качестве имен столбцов, чтобы избежать путаницы и затруднений с их использованием. 3. Если у вас есть 60 числовых столбцов, то данные там * * являются числовыми, конечно; вы не можете поместить числовые числа в числовой столбец. Или вы говорите, что хотите проверить нули? ** Мой сильный совет: измените свою модель данных. Это сделает вещи намного проще для вас. ** –

+0

Проблема заключается в том, что клиент будет предоставлять нам файл в формате, где 2009 будет столбцом, я динамически отключаю их как строки в sql-сервере. Теперь я хочу проверить файл клиента на сервере sql, чтобы проверить, что этот столбец должен иметь только числовые поля. – Mohit

ответ

1

Best вы можете сделать в одном операторе с помощью UNPIVOT, но вам все равно придется wrie все столбцы:

DECLARE @t TABLE(id INT IDENTITY, [2008] VARCHAR(100), [2009] VARCHAR(100), [2011] VARCHAR(100)) 

INSERT INTO @t VALUES 
('1.1', 'asd', '1'), 
('200.1', '2', '1'), 
('11', '3', 'jj') 

SELECT * FROM @t 
UNPIVOT(a FOR b IN([2008],[2009],[2011]))u 
WHERE ISNUMERIC(a) <> 1 AND b LIKE '%200%' 

Выход:

id a b 
1 asd 2009 

Другой способ заключается в использовании динамического sql:

CREATE TABLE TableTest(id INT IDENTITY, name VARCHAR(100), [2008] VARCHAR(100), [2009] VARCHAR(100), [2011] VARCHAR(100)) 

INSERT INTO TableTest VALUES 
('name1', '1.1', 'asd', '1'), 
('name2', '200.1', '2', '1'), 
('name3', '11', '3', 'jj') 

DECLARE @cols VARCHAR(MAX) = STUFF((SELECT ',' + QUOTENAME(c.name) FROM sys.columns c 
JOIN sys.objects o ON o.object_id = c.object_id 
WHERE o.name = 'TableTest' AND c.name LIKE '%200%' 
FOR XML PATH('') 
), 1, 1, '') 


DECLARE @sql VARCHAR(MAX) = 
'SELECT * FROM TableTest 
UNPIVOT(a FOR b IN('[email protected]+'))u 
WHERE ISNUMERIC(a) <> 1' 

EXEC(@sql) 

Выход:

id name 2011 a b 
1 name1 1  asd 2009 
Смежные вопросы