programing

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

codeshow 2023. 4. 7. 21:47
반응형

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

SQL Server SYSNAME 데이터 타입의 용도는 무엇입니까?BOL은 다음과 같이 표시됩니다.

sysname 데이터 유형은 객체 이름을 저장하는 테이블 열, 변수 및 저장 프로시저 파라미터에 사용됩니다.

이해가 잘 안 돼요제공할 수 있는 사용 사례가 있습니까?

sysname 시 Unicode 문자(로 제한되는 입니다.은 cannot음음음음음음 be be be be be be be be be be be가 될 수 .NULL

으로는 사용법과 .nvarchar(128) NOT NULL

편집

했듯이 @Jim을 sysname솔직히 말해서. Microsoft를 할 때 합니다.sysSQL Server에서 사용할 수 있습니다.

를 들어, 「」를 실행해 .Exec sp_help 'sys.tables' 컬럼이 됩니다.name되어 있습니다.sysname이것은 이것의 가치가 실제로 그 자체로 객체이기 때문이다(표).

나는 그것에 대해 크게 걱정하지 않을 것이다.

Server5 하고 있는 사람이 Server 6.5의 이 포함되어 것도가 있습니다.에게는 다음과 같은 기본 제공 유형이 있습니다.sysname 상당하다varchar(30)

문서

sysname는 및 비고 섹션에 기재되어 있는 매뉴얼과 함께 정의되어 있습니다.

sysnamenvarchar(128)와 기능적으로 동등한 시스템 제공 사용자 정의 데이터 유형입니다.단, 늘은 아닙니다.sysname은 데이터베이스 객체 이름을 참조하기 위해 사용됩니다.

위의 발언을 명확히 하기 위해 기본적으로는 sysname은 다음과 같이 정의됩니다.NOT NULL확실히 무효라고 정의할 수 있습니다.SQL Server를 사용합니다.

특수 데이터 유형 사용

sysname 데이터 유형은 객체 이름을 저장하는 테이블 열, 변수 및 저장 프로시저 파라미터에 사용됩니다.sysname의 정확한 정의는 식별자 규칙과 관련되어 있습니다.따라서 SQL Server 인스턴스마다 다를 수 있습니다.sysname기본적으로는 nvarchar(128)와 동일하지만 기본적으로 sysname은 NOT NULL이 아닙니다.SQL Server 이전 버전에서는 sysname은 varchar(30)로 정의되어 있습니다.

「 」의 sysname 또는 NULL값은 https://stackoverflow.com/a/52290792/300863 에서 확인할 수 있습니다.

디폴트라고 해서(NOT NULL이 아님) 보증은 없습니다.

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

동적 SQL을 생성할 필요가 있는 경우 사용하는 것이 적절합니다.sysname테이블 이름, 열 이름 및 서버 이름을 포함하는 변수의 데이터 유형으로 지정합니다.

참고인으로서...

select * from sys.types where system_type_id = 2312번입니다.

(아직 무슨 의미인지는 모르겠지만 100%는 내 코드를 망치고 있다고 확신해)

edit: 이 상황(내 상황)에서는 user_type_id에 의해 참여하거나 user_type_id와 system_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에서 테이블 'Students_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

sysname요.sp_send_dbmail"지정된 수신자에게 전자 메일메시지를 보내는 저장 프로시저"로 msdb 데이터베이스에 저장됩니다.

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

[ @profile_name = ] 'profile_name'  

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

FWIW는 다음과 같은 유용한 시스템 SP에 테이블 이름을 전달할 수 있습니다.데이터베이스를 탐색하려면 다음과 같이 하십시오.

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

다른 활용 사례는 SQL 기능을 하는 경우 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에러가 발생합니다).

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

데이터베이스 유지 보수 스크립트에서 사용할 개체 이름을 저장할 위치.예를 들어 스크립트는 날짜 열이 있는 특정 테이블에서 오래된 행을 삭제합니다.테이블 이름, 필터링할 열 이름 및 보관할 이력을 제공하는 테이블로 구성됩니다.다른 스크립트는 특정 테이블을 CSV 파일에 덤프하고 덤프할 테이블을 나열하는 테이블을 다시 설정합니다.이러한 설정 테이블에서는,sysname테이블 및 열 이름을 저장합니다.

언급URL : https://stackoverflow.com/questions/5720212/what-is-sysname-data-type-in-sql-server

반응형