Как я могу сравнить урезанную и необрезанную длины полей без повторного ввода имени поля?

#sql #database #sql-server-2005

#sql #База данных #sql-server-2005

Вопрос:

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

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

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

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

 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)

Спасибо!

Комментарии:

1. Вам нужно будет ввести имена только один раз, если вы использовали where column like '% ' 🙂

Ответ №1:

Я бы просто позволил 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 — это все, что вам нужно проверить?

Комментарии:

1. Да — мне нужны только поля, которые являются переменными

2. Я просто подумал, что NVARCHAR также может быть важен, но, возможно, вы их не используете или, возможно, они не актуальны.

Ответ №2:

Если понимать вас буквально, если вы хотите избежать двойного ввода имен полей, попросите 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
  

Ответ №3:

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

  1. Скопируйте список имен полей в новые файлы, разделенные разрывами строк
  2. Ctrl R
  3. Включить регулярные выражения
  4. Найти ^(. ) $
  5. Заменить на «1LenMatch В СЛУЧАЕ, КОГДА DATALENGTH(1) = DATALENGTH(RTRIM(1)) ТОГДА 1 ЕЩЕ 0 ЗАКАНЧИВАЕТСЯ » или любой другой строкой sql, которая вам нужна, и включите 1, куда вы хотели бы поместить имя поля.

Ответ №4:

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

Пример:

 Select Columns...
From   Table
Where  CharIndex(' ', Reverse(ColumnName)) = 1