[sql] SQL Server의 SYSNAME 데이터 형식은 무엇입니까?

SQL Server SYSNAME 데이터 유형은 무엇입니까? BOL의 말 :

sysname 데이터 형식은 개체 이름을 저장하는 테이블 열, 변수 및 저장 프로 시저 매개 변수에 사용됩니다.

그러나 나는 그것을 정말로 얻지 못한다. 제공 할 수있는 사용 사례가 있습니까?



답변

sysnameIIRC라는 128 개의 유니 코드 문자로 제한된 내장 데이터 유형으로, 스크립트를 만들 때 주로 객체 이름을 저장하는 데 사용됩니다. 그 가치는NULL

기본적으로 사용하는 것과 같습니다 nvarchar(128) NOT NULL

편집하다

의견에서 @Jim이 언급했듯이 sysname정직 하게 사용할 비즈니스 사례가 실제로 있다고 생각하지 않습니다 . 주로 sysSQL Server 내 에서 내부 테이블 및 저장 프로 시저를 작성할 때 Microsoft에서 사용합니다 .

예를 들어, 실행 Exec sp_help 'sys.tables'하면 열 name이 다음과 같이 정의되어 있음을 알 수 있습니다. sysname이 값은 실제로 그 자체로 개체이기 때문에 (테이블)

나는 그것에 대해 너무 걱정할 것입니다.

SQL Server 6.5 이하 버전을 사용하는 사람들 (아직 사람들이 사용하고 있습니까?)에 내장 된 유형 sysname은 다음과 같습니다.varchar(30)

선적 서류 비치

sysname는 비고 섹션에서 nchar및에nvarchar 대한 문서를 통해 정의됩니다 .

sysnamenvarchar (128) 과 기능적으로 동등한 시스템 제공 사용자 정의 데이터 유형 이며 널 입력 가능하지 않습니다. sysname 은 데이터베이스 오브젝트 이름을 참조하는 데 사용됩니다.

위의 설명을 명확히하기 위해 기본적으로 sysnameNOT NULLnullable로 정의 할 수 있으므로 정의됩니다. 정확한 정의는 SQL Server 인스턴스마다 다를 수 있습니다.

특수 데이터 유형 사용

를 sysname 데이터 형식은 테이블 열 변수를 사용하고, 저장하는 오브젝트 이름 절차 파라미터들을 저장한다. sysname 의 정확한 정의는
식별자 규칙과 관련이 있습니다. 따라서 SQL Server 인스턴스마다 다를 수 있습니다. sysname 은 기본적으로 sysname 이 NULL이 아님을 제외하고 nvarchar (128) 와 기능적으로 동일 합니다. 이전 버전의 SQL Server에서 sysname 은 varchar (30)로 정의됩니다.

sysname허용 또는 거부 에 대한 추가 정보는 https://stackoverflow.com/a/52290792/300863NULL 에서 확인할 수 있습니다.

그것이 기본값 (NOT NULL이 아니기 때문에)이 될 것이라고 보장하지는 않습니다!


답변

제공 할 수있는 사용 사례가 있습니까?

동적 SQL 을 작성해야하는 경우 sysname테이블 이름, 열 이름 및 서버 이름을 보유하는 변수의 데이터 유형 으로 사용하는 것이 좋습니다.


답변

참고로 ….

select * from sys.types where system_type_id = 231 두 줄을 제공합니다.

(이것이 아직 무엇을 의미하는지는 모르겠지만 지금은 내 코드를 망쳐 놓고 100 % 확신합니다)

편집 : 나는이 상황 (나의 상황) 또는 아마도 user_type_id와 esystem_type_id 모두에서 user_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


답변

아래에 사용 사례를 나열하겠습니다. 도움이 되길 바랍니다. 여기서 DB ‘Students’에서 ‘Stud_dtls’테이블의 테이블 소유자를 찾으려고합니다. Mikael이 언급했듯이 sysname은 테이블 이름, 열 이름 및 서버 이름을 보유하는 변수가 필요한 동적 SQL을 작성해야 할 때 사용할 수 있습니다. 그의 요점을 보완하는 간단한 예를 제공하는 것을 생각했습니다.

USE Students

DECLARE @TABLE_NAME sysname

SELECT @TABLE_NAME = 'Stud_dtls'

SELECT TABLE_SCHEMA
  FROM INFORMATION_SCHEMA.Tables
 WHERE TABLE_NAME = @TABLE_NAME


답변

sysnamesp_send_dbmail“지정된받는 사람에게 전자 메일 메시지를 보내고”msdb 데이터베이스에있는 저장 프로 시저 인에 의해 사용됩니다 .

에 따르면 마이크로 소프트 ,

[ @profile_name = ] 'profile_name'  

메시지를 보낼 프로필의 이름입니다. profile_name은 sysname 유형이며 기본값은 NULL입니다. profile_name은 기존 데이터베이스 메일 프로파일의 이름이어야합니다. profile_name을 지정하지 않으면 sp_send_dbmail은 현재 사용자의 기본 개인 프로필을 사용합니다. 사용자에게 기본 개인 프로필이 없으면 sp_send_dbmail은 msdb 데이터베이스에 대한 기본 공용 프로필을 사용합니다. 사용자에게 기본 개인 프로파일이없고 데이터베이스에 대한 기본 공용 프로파일이없는 경우 @profile_name을 지정해야합니다.


답변

다음과 같은 방법으로 데이터베이스를 탐색하려는 경우 다음과 같이 유용한 시스템 SP에 테이블 이름을 전달할 수 있습니다.

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


답변

또 다른 사용 사례는 SQL Server 2016+ 기능을 사용할 때입니다. AT TIME ZONE

아래 문장은 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오류를 유발할 것이라고 선언 ).