Как я могу сравнить обрезанные и необрезанные длины полей без повторного ввода имени поля? - PullRequest
3 голосов
/ 11 мая 2011

По сути, я хочу проверить, есть ли пробелы справа от текста в поле varchar.Для этого я хочу сравнить DATALENGTH(fieldName) с DATALENGTH(RTRIM(fieldName)).

Это не так сложно.

Единственное, что мне нужно сделать это для всех полей varcharв пяти таблицах.Получается около 250 полей, которые мне нужно сравнить таким образом.Есть ли способ, которым я могу поместить все эти имена полей в один запрос, не вводя имя каждого 2x?

Я использую этот запрос, чтобы получить имена полей, на которые нужно посмотреть.

SELECT name FROM sys.columns WHERE object_id = 
    (SELECT object_id FROM sys.tables WHERE name='tableName') 
AND system_type_id = 167

(Использование SQL Server 2005)

Спасибо!

Ответы [ 4 ]

2 голосов
/ 11 мая 2011

Я бы просто позволил SQL Server сгенерировать для меня код, если он просто печатает, что является проблемой:

SELECT
    'SELECT * FROM ' + o.name + ' WHERE DATALENGTH(' + c.name + ') > DATALENGTH(RTRIM(' + c.name + '))'
FROM
    sys.objects o
INNER JOIN sys.columns c ON
    c.object_id = o.object_id AND
    c.system_type_id = 167
WHERE
    o.name = 'tableName'

Вы уверены, что тип 167 - это все, что вам нужно проверить, хотя?

0 голосов
/ 12 мая 2011

Другой способ сделать это - повернуть строку и проверить первый пробел.Если это 1, в конце ваших данных есть пробел.Если это 0, пробелов нет.Если оно больше 1, есть пробел, но он не в конце данных.

Пример:

Select Columns...
From   Table
Where  CharIndex(' ', Reverse(ColumnName)) = 1
0 голосов
/ 11 мая 2011

Буквально говоря, если вы хотите избежать повторного ввода имен полей, попросите SQL Server выполнить набор за вас.

Select ' Or DataLength(' + Name + ')<>DataLength(RTrim(' + Name + '))'
  From sys.Columns
 Where Object_ID=Object_ID('Employees')
   And System_Type_ID=167

(Обратите внимание, что вам не нужна явная ссылка на sys.tables, функция Object_ID сделает это за вас!)

Тем не менее, я думаю, что вы действительно спрашиваете, как определить, заканчивается ли значение одним или несколькими пробелами, не сравнивая длины таким способом.,Ответ заключается в использовании хранимой функции.

Create Function Dbo.EndsWithSpaces(@Value Varchar(8000)) Returns Bit
As Begin
  Return Case When DataLength(@Value)=DataLength(RTrim(@Value)) Then 0
              Else 1 End
End

Теперь вы можете проверить наличие пробелов в конце для любого значения: Dbo.EndsWithSpaces(Value)=1 Конечно, вы все равно можете заставить SQL Server сгенерировать конец предложения Where для вас.:

Select ' Or Dbo.EndsWithSpaces(' + Name + ')=1'
  From sys.Columns
 Where Object_ID=Object_ID('Employees')
   And System_Type_ID=167
0 голосов
/ 11 мая 2011

Я не уверен, как это сделать в SQL, хотя я подозреваю, что вам нужно будет сгенерировать строку SQL и затем выполнить. Я все время использую Notepad ++ для подобных вещей.

  1. Скопировать список имен полей в новые файлы, разделенные переносами строк
  2. Ctrl + R
  3. Включить регулярные выражения
  4. Найти ^ (. +) $
  5. Замените на "\ 1LenMatch AS CASE WHEN DATALENGTH (\ 1) = DATALENGTH (RTRIM (\ 1)) THEN 1 ELSE 0 END", или на любую строку sql, которая вам нужна, и включите \ 1 там, где вы хотите, чтобы имя поля было идти.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...