Динамический запрос для определения длины строк в столбце на сервере SQL - PullRequest
0 голосов
/ 23 апреля 2019

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

Ответы [ 3 ]

0 голосов
/ 23 апреля 2019

вы можете использовать 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
0 голосов
/ 23 апреля 2019

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

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
0 голосов
/ 23 апреля 2019

Предполагая, что все ваши столбцы являются строковыми столбцами, функция 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...