#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 для такого рода задач.
- Скопируйте список имен полей в новые файлы, разделенные разрывами строк
- Ctrl R
- Включить регулярные выражения
- Найти ^(. ) $
- Заменить на «1LenMatch В СЛУЧАЕ, КОГДА DATALENGTH(1) = DATALENGTH(RTRIM(1)) ТОГДА 1 ЕЩЕ 0 ЗАКАНЧИВАЕТСЯ » или любой другой строкой sql, которая вам нужна, и включите 1, куда вы хотели бы поместить имя поля.
Ответ №4:
Другим способом сделать это было бы перевернуть строку и проверить наличие первого пробела. Если это 1, то в конце ваших данных есть пробел. Если это 0, то пробелов нет. Если оно больше 1, значит, есть пробел, но его нет в конце данных.
Пример:
Select Columns...
From Table
Where CharIndex(' ', Reverse(ColumnName)) = 1