SQL ServerのSYSNAMEデータ型は何のためですか? BOL 言います:
Sysnameデータ型は、テーブル列、変数、およびオブジェクト名を格納するストアドプロシージャパラメータに使用されます。
しかし、私は本当にそれを得ません。提供できるユースケースはありますか?
sysname
は、128個のUnicode文字に制限された組み込みデータ型であり、IIRCは、スクリプトを作成するときに主にオブジェクト名を格納するために使用されます。その値はNULL
にはできません
基本的にnvarchar(128) NOT NULL
を使用するのと同じです
編集
コメントで@Jimが言及したように、正直に言うとsysname
を使用するビジネスケースは実際にはないと思います。 SQL Server内で内部sys
テーブルやストアドプロシージャなどを構築するときに、主にMicrosoftによって使用されます。
たとえば、Exec sp_help 'sys.tables'
を実行すると、列name
がsysname
として定義されていることがわかります。これは、この値が実際にはそれ自体のオブジェクト(テーブル)であるためです。
私はそれについて心配しすぎます。
また、SQL Server 6.5以前をまだ使用している(まだ使用している人はいますか?)場合、sysname
の組み込み型はvarchar(30)
と同等であることに注意してください
ドキュメント
sysname
は、注釈セクションのnchar
およびnvarchar
のドキュメントで定義されています。
sysnameは、システムが提供するユーザー定義のデータ型であり、機能的にnvarchar(128)。ただし、null許容ではありません。 sysnameは、データベースオブジェクト名を参照するために使用されます。
上記のコメントを明確にするために、defaultsysnameによってNOT NULL
として定義されますヌル可能として定義することができます。 SQL Serverのインスタンス間で正確な定義が異なる可能性があることに注意することも重要です。
sysnameデータ型は、テーブル列、変数、およびオブジェクト名を格納するストアドプロシージャパラメータに使用されます。 sysnameの正確な定義は、識別子のルールに関連しています。したがって、SQL Serverのインスタンスによって異なる場合があります。 sysnameは、機能的にはnvarchar(128)と同じですが、デフォルトでは、sysnameはNOT NULLです。 SQL Serverの以前のバージョンでは、sysnameはvarchar(30)として定義されています。
提供できるユースケースはありますか?
dynamic sql を作成する必要がある場合、テーブル名、列名、サーバー名を保持する変数のデータ型としてsysname
を使用するのが適切です。
以下にユースケースをリストします。それが役に立てば幸い。ここでは、データベース「Students」からテーブル「Stud_dtls」のテーブル所有者を見つけようとしています。 Mikaelが述べたように、テーブル名、列名、サーバー名を保持する変数を必要とする動的SQLを作成する必要がある場合、sysnameを使用できます。彼の要点を補足する簡単な例を提供することを考えました。
USE Students
DECLARE @TABLE_NAME sysname
SELECT @TABLE_NAME = 'Stud_dtls'
SELECT TABLE_SCHEMA
FROM INFORMATION_SCHEMA.Tables
WHERE TABLE_NAME = @TABLE_NAME
参考までに...
select * from sys.types where system_type_id = 231
は2行を提供します。
(これが何を意味するのかまだわかりませんが、今はコードを台無しにしていることを100%確信しています)
編集:私は、この状況(私の状況)でuser_type_idによって、または場合によってはuser_type_idとth esystem_type_idの両方で参加する必要があることを意味すると思います
name system_type_id user_type_id schema_id principal_id max_length precision scale collation_name is_nullable is_user_defined is_Assembly_type default_object_id rule_object_id
nvarchar 231 231 4 NULL 8000 0 0 SQL_Latin1_General_CP1_CI_AS 1 0 0 0 0
sysname 231 256 4 NULL 256 0 0 SQL_Latin1_General_CP1_CI_AS 0 0 0 0 0
create procedure dbo.yyy_test (
@col_one nvarchar(max),
@col_two nvarchar(max) = 'default',
@col_three nvarchar(1),
@col_four nvarchar(1) = 'default',
@col_five nvarchar(128),
@col_six nvarchar(128) = 'default',
@col_seven sysname
)
as begin
select 1
end
このクエリ:
select parm.name AS Parameter,
parm.max_length,
parm.parameter_id
from sys.procedures sp
join sys.parameters parm ON sp.object_id = parm.object_id
where sp.name = 'yyy_test'
order by parm.parameter_id
収量:
parameter max_length parameter_id
@col_one -1 1
@col_two -1 2
@col_three 2 3
@col_four 2 4
@col_five 256 5
@col_six 256 6
@col_seven 256 7
およびこれ:
select parm.name as parameter,
parm.max_length,
parm.parameter_id,
typ.name as data_type,
typ.system_type_id,
typ.user_type_id,
typ.collation_name,
typ.is_nullable
from sys.procedures sp
join sys.parameters parm ON sp.object_id = parm.object_id
join sys.types typ ON parm.system_type_id = typ.system_type_id
where sp.name = 'yyy_test'
order by parm.parameter_id
これを与える:
parameter max_length parameter_id data_type system_type_id user_type_id collation_name is_nullable
@col_one -1 1 nvarchar 231 231 SQL_Latin1_General_CP1_CI_AS 1
@col_one -1 1 sysname 231 256 SQL_Latin1_General_CP1_CI_AS 0
@col_two -1 2 nvarchar 231 231 SQL_Latin1_General_CP1_CI_AS 1
@col_two -1 2 sysname 231 256 SQL_Latin1_General_CP1_CI_AS 0
@col_three 2 3 nvarchar 231 231 SQL_Latin1_General_CP1_CI_AS 1
@col_three 2 3 sysname 231 256 SQL_Latin1_General_CP1_CI_AS 0
@col_four 2 4 nvarchar 231 231 SQL_Latin1_General_CP1_CI_AS 1
@col_four 2 4 sysname 231 256 SQL_Latin1_General_CP1_CI_AS 0
@col_five 256 5 nvarchar 231 231 SQL_Latin1_General_CP1_CI_AS 1
@col_five 256 5 sysname 231 256 SQL_Latin1_General_CP1_CI_AS 0
@col_six 256 6 nvarchar 231 231 SQL_Latin1_General_CP1_CI_AS 1
@col_six 256 6 sysname 231 256 SQL_Latin1_General_CP1_CI_AS 0
@col_seven 256 7 nvarchar 231 231 SQL_Latin1_General_CP1_CI_AS 1
@col_seven 256 7 sysname 231 256 SQL_Latin1_General_CP1_CI_AS 0
FWIW、このような便利なシステムSPにテーブル名を渡すことができます、そのようにデータベースを探索したい場合:
DECLARE @Table sysname; SET @Table = 'TableName';
EXEC sp_fkeys @Table;
EXEC sp_help @Table;
sysname
は、sp_send_dbmail
(「指定された受信者に電子メールメッセージを送信する」ストアドプロシージャ)によって使用され、msdbデータベースにあります。
Microsoft によると、
[ @profile_name = ] 'profile_name'
メッセージの送信元のプロファイルの名前です。 profile_nameはsysnameタイプで、デフォルトはNULLです。 profile_nameは、既存のデータベースメールプロファイルの名前である必要があります。 profile_nameが指定されていない場合、sp_send_dbmailは現在のユーザーのデフォルトのプライベートプロファイルを使用します。ユーザーにデフォルトのプライベートプロファイルがない場合、sp_send_dbmailはmsdbデータベースのデフォルトのパブリックプロファイルを使用します。ユーザーにデフォルトのプライベートプロファイルがなく、データベースのデフォルトのパブリックプロファイルがない場合は、@ profile_nameを指定する必要があります。
別の使用例は、AT TIME ZONE
のSQL Server 2016+機能を使用する場合です。
以下のステートメントは、GMTに変換された日付を返します
SELECT
CONVERT(DATETIME, SWITCHOFFSET([ColumnA], DATEPART(TZOFFSET, [ColumnA] AT TIME ZONE 'GMT Standard Time')))
タイムゾーンを変数として渡したい場合は、次のように言います。
SELECT
CONVERT(DATETIME, SWITCHOFFSET([ColumnA], DATEPART(TZOFFSET, [ColumnA] AT TIME ZONE @TimeZone)))
その変数はsysname
型である必要があります(varchar
として宣言するとエラーが発生します)。