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
Нет. Но вы можете написать динамический SQL, который сделает это за вас. Вот старт: http://stackoverflow.com/questions/20463365/looping-through-column-names-with-dynamic-sql Начните с этого и отправляйте назад, если вы застряли. –
1. Ваша модель данных кажется очень плохим. Новые данные никогда не должны приводить к новым столбцам, а только к новым строкам. (I.e. вы хотите добавить * данные * не изменять * структуру данных *.) 2. 2009 - плохое имя столбца. Вы не должны использовать числа в качестве имен столбцов, чтобы избежать путаницы и затруднений с их использованием. 3. Если у вас есть 60 числовых столбцов, то данные там * * являются числовыми, конечно; вы не можете поместить числовые числа в числовой столбец. Или вы говорите, что хотите проверить нули? ** Мой сильный совет: измените свою модель данных. Это сделает вещи намного проще для вас. ** –
Проблема заключается в том, что клиент будет предоставлять нам файл в формате, где 2009 будет столбцом, я динамически отключаю их как строки в sql-сервере. Теперь я хочу проверить файл клиента на сервере sql, чтобы проверить, что этот столбец должен иметь только числовые поля. – Mohit