Когда я читаю, вам нужен динамический sql для таблиц большего размера, чем в вашем примере (это должно быть частью вашего вопроса)
Я использовал unpivot для сравнения всех длин одновременно
DECLARE @TableName VARCHAR(100) = 'YourTableName'
DECLARE @MaxLen INT = 7
DECLARE @Definition
TABLE (
ColumnName VARCHAR(50)
)
INSERT @Definition
SELECT C.Name
FROM
sys.columns C
JOIN sys.tables T
ON C.object_id = T.object_id
WHERE t.name = @TableName
DECLARE @Columns VARCHAR(MAX) = ''
DECLARE @ColumnsWithCast VARCHAR(MAX) = ''
SET @Columns = STUFF(
(SELECT ',' + ColumnName
FROM @Definition
FOR XML PATH('')
),
1,
1,
'')
SET @ColumnsWithCast = STUFF(
(SELECT ',CAST(' + ColumnName + ' AS VARCHAR(MAX)) AS ' + ColumnName
FROM @Definition
FOR XML PATH('')
),
1,
1,
'')
DECLARE @SQL NVARCHAR(MAX) = N'
SELECT DISTINCT
Field
FROM (
SELECT
' + @ColumnsWithCast + '
FROM ' + @TableName + ' A
) p
UNPIVOT (
Value FOR Field IN (
' + @Columns + '
)
)AS unpvt
WHERE LEN(Value) > @MaxLen
'
DECLARE @ParamDefinition NVARCHAR(100) = N'@MaxLen INT'
EXEC sp_executesql @SQL, @ParamDefinition, @MaxLen = @MaxLen
Он сгенерирует этот код со всеми существующими столбцами
SELECT DISTINCT
Field
FROM (
SELECT
CAST(Name AS VARCHAR(MAX)) AS Name,
CAST(Address AS VARCHAR(MAX)) AS Address,
CAST(PhoneNumber AS VARCHAR(MAX)) AS PhoneNumber,
FROM HIERARCHY A
) p
UNPIVOT (
Value FOR Field IN (
Name, Address, PhoneNumber
)
)AS unpvt
WHERE LEN(Value) > @MaxLen