Динамический запрос для определения длины строк в столбце в sql Server

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Мне нужно подготовить динамический запрос для определения длины всех строк в столбце в sql Server. допустим, есть ли 10 столбцов для таблицы со 100 строками. Мне нужно динамически находить длину строки для каждого столбца.

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

1. Вы используете MS SQL Server или Postgresql?

2. Образец данных? ожидаемый результат?

3. @UsmanMirza результат должен давать сумму длин строк для каждого столбца

4. @sumy, то есть вы хотели бы получить результат в одну строку с отдельным столбцом, содержащим общую длину значения столбца? Это только для строковых столбцов? А как насчет других типов данных? Один и тот же запрос не будет работать для обоих продуктов СУБД.

5. @sumy . . . Пожалуйста, объясните, что это должно означать: «Мне нужно динамически находить длину строки для каждого столбца». Это утверждение не имеет для меня никакого смысла. Столбцы не имеют «длины строк».

Ответ №1:

Предполагая, что все ваши столбцы являются строковыми столбцами, хотя len функция должна работать в любом случае.

 -- replace 'mytable' with the actual table name
declare @tableName nvarchar(128) = 'mytable';
declare @queryToRun nvarchar(max) = '';

-- IMPORTANT: following query is putting each column name as len_columnName
select  @queryToRun = @queryToRun   ', len(['   c.name   ']) as [len_'   c.name   ']
'
from    sys.tables as t
        inner join sys.columns as c on t.object_id = c.object_id
where   t.name = @tableName

-- removing the first comma
set @queryToRun = SUBSTRING(@queryToRun, 2, len(@queryToRun) - 1);

-- creating the query with dynamic column names
set @queryToRun = 'select '   @queryToRun   ' from '   @tableName;

--print @queryToRun

exec (@queryToRun)
  

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

1. Можете ли вы предоставить его в таком формате — имя_таблицы, имя_столбца и сумма длины строк по столбцам

2. From Len() : «Возвращает количество символов указанного строкового выражения, исключая конечные пробелы DataLength не исключает конечные пробелы. Для строк в Юникоде вы можете использовать DataLength( UnicodeStringExpression ) / DataLength( N'#' ) , чтобы получить длину в символах. В общем случае DataLength( Left( Coalesce( StringExpression, '#' ), 1 ) ) вернет количество байт на символ.

3. @HABO, я все еще НЕ уверен, что OP пытается сделать, вот почему я сделал это простым. В противном случае, да, то, что вы предлагаете, правильно и дало бы точный результат.

Ответ №2:

вы можете использовать sys.tables и sys.all_columns

 declare @Sql nvarchar(max)='select '
select @Sql=@sql 'Sum(len(' QUOTENAME(c.name) ')) as Len' QUOTENAME(c.name) ',' from sys.tables t join sys.all_columns c on t.object_id=c.object_id 
where t.Name='YourTableName'
set @Sql = left(@Sql,len(@sql)-1) ' from YourTableName' 
select @Sql
  

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

1. Совет: При сборке имен объектов в динамические инструкции SQL рекомендуется использовать, QuoteName() чтобы избежать проблем с нечетными именами, например, New Table с пробелом или зарезервированными словами типа From .

2. спасибо за ваш практический совет, он очень полезен на моем языке

Ответ №3:

Попробуйте этот скрипт, вы получите длину данных для каждого столбца в таблице динамически

 IF OBJECT_ID('dbo.LenghtOfRows')IS NOT NULL
DROP TABLE LenghtOfRows
CREATE TABLE LenghtOfRows (
                Id Int IDENTITY,
                Sqlode nvarchar(max)
                )
DECLARE @SQL NVARCHAR(max),
        @MinId INT,
        @MaxId INT,
        @tableName Varchar(100) ='StudentLabExamScore', --Give Table name here
        @GetSQL NVARCHAR(max)

SET @SQL = 'SELECT ''SELECT  DATALENGTH('' COLUMN_NAME '') As Len_''  COLUMN_NAME  '' FROM '' TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ''' @tableName ''''
PRINT @SQL

INSERT INTO LenghtOfRows(Sqlode)
EXEC ( @SQL)

SELECT @MinId = MIN(Id) from LenghtOfRows
SELECT @MaxId = MAX(Id) from LenghtOfRows

WHILE (@MInId <=@MaxId)
BEGIN
SELECT @GetSQL= Sqlode FROM LenghtOfRows WHERE id=@MInId
EXEC (@GetSQL)
PRINT @GetSQL
SET @MInId=@MInId 1
END