web-dev-qa-db-ja.com

1つのSQL文でvarchar [n]フィールドのサイズを取得する方法は?

「注釈」と呼ばれるvarchar [1000]フィールドを持つSQLテーブルがあるとします。

単一のSQLステートメントを作成し、実行すると1000、または将来varcharフィールドのサイズが変更される可能性があるものを返します。

SELECT size(Remarks) FROM mytableのようなもの。

どうすればいいですか?

64
select column_name, data_type, character_maximum_length    
  from information_schema.columns  
 where table_name = 'myTable'
101
Neil Knight

特にSQL Serverの場合:

SELECT DATALENGTH(Remarks) AS FIELDSIZE FROM mytable

ドキュメント

23
MarcE

SQL Server(2008以降)の場合:

SELECT COLUMNPROPERTY(OBJECT_ID('mytable'), 'Remarks', 'PRECISION');

COLUMNPROPERTYは、列またはパラメーターの情報(ID、列/パラメーター、プロパティ)を返します。 PRECISIONプロパティは、列またはパラメーターのデータ型の長さを返します。

COLUMNPROPERTYドキュメント

8
Frank

これはSQL SERVERで動作します...

SELECT COL_LENGTH('Table', 'Column')
3
Greg Quinn

コラムの合計サイズを探していて、この記事を読みました。私のソリューションはMarcEに基づいています。

SELECT sum(DATALENGTH(your_field)) AS FIELDSIZE FROM your_table
2
ProVega
select column_name, data_type, character_maximum_length    
from INFORMATION_SCHEMA.COLUMNS
where table_name = 'Table1'
0
HQtunes.epizy

T-SQLの場合、varchar列に対して次のクエリを使用します(照合順序とis_nullプロパティを示します)。

SELECT
    s.name
    , o.name as table_name
    , c.name as column_name
    , t.name as type
    , c.max_length
    , c.collation_name
    , c.is_nullable
FROM
    sys.columns c
    INNER JOIN sys.objects o ON (o.object_id = c.object_id)
    INNER JOIN sys.schemas s ON (s.schema_id = o.schema_id)
    INNER JOIN sys.types t ON (t.user_type_id = c.user_type_id)
WHERE
    s.name = 'dbo'
    AND t.name IN ('varchar') -- , 'char', 'nvarchar', 'nchar')
ORDER BY
    o.name, c.name
0
Andrei Sura

Varchar(Nn)の最大有効長を計算する関数は次のとおりです。

CREATE FUNCTION [dbo].[GetMaxVarcharColumnLength] (@TableSchema NVARCHAR(MAX), @TableName NVARCHAR(MAX), @ColumnName VARCHAR(MAX))
RETURNS INT
AS
BEGIN
    RETURN (SELECT character_maximum_length FROM information_schema.columns  
            WHERE table_schema = @TableSchema AND table_name = @TableName AND column_name = @ColumnName);
END

使用法:

IF LEN(@Name) > [dbo].[GetMaxVarcharColumnLength]('person', 'FamilyStateName', 'Name') 
            RETURN [dbo].[err_Internal_StringForVarcharTooLong]();
0