web-dev-qa-db-ja.com

SQL ServerのSYSNAMEデータ型とは何ですか?

SQL ServerのSYSNAMEデータ型は何のためですか? BOL 言います:

Sysnameデータ型は、テーブル列、変数、およびオブジェクト名を格納するストアドプロシージャパラメータに使用されます。

しかし、私は本当にそれを得ません。提供できるユースケースはありますか?

109
jrara

sysnameは、128個のUnicode文字に制限された組み込みデータ型であり、IIRCは、スクリプトを作成するときに主にオブジェクト名を格納するために使用されます。その値はNULLにはできません

基本的にnvarchar(128) NOT NULLを使用するのと同じです

編集

コメントで@Jimが言及したように、正直に言うとsysnameを使用するビジネスケースは実際にはないと思います。 SQL Server内で内部sysテーブルやストアドプロシージャなどを構築するときに、主にMicrosoftによって使用されます。

たとえば、Exec sp_help 'sys.tables'を実行すると、列namesysnameとして定義されていることがわかります。これは、この値が実際にはそれ自体のオブジェクト(テーブル)であるためです。

私はそれについて心配しすぎます。

また、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)として定義されています。

126
codingbadger

提供できるユースケースはありますか?

dynamic sql を作成する必要がある場合、テーブル名、列名、サーバー名を保持する変数のデータ型としてsysnameを使用するのが適切です。

55
Mikael Eriksson

以下にユースケースをリストします。それが役に立てば幸い。ここでは、データベース「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
3
aok

参考までに...

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
3
gloomy.penguin

FWIW、このような便利なシステムSPにテーブル名を渡すことができます、そのようにデータベースを探索したい場合:

DECLARE @Table sysname; SET @Table = 'TableName';
EXEC sp_fkeys @Table;
EXEC sp_help @Table;
1
AjV Jsy

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を指定する必要があります。

1
usefulBee

別の使用例は、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として宣言するとエラーが発生します)。

0
d219