#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