답변:
sysname
IIRC라는 128 개의 유니 코드 문자로 제한된 내장 데이터 유형으로, 스크립트를 만들 때 주로 객체 이름을 저장하는 데 사용됩니다. 그 가치는NULL
기본적으로 사용하는 것과 같습니다 nvarchar(128) NOT NULL
편집하다
의견에서 @Jim이 언급했듯이 sysname
정직 하게 사용할 비즈니스 사례가 실제로 있다고 생각하지 않습니다 . 주로 sys
SQL Server 내 에서 내부 테이블 및 저장 프로 시저를 작성할 때 Microsoft에서 사용합니다 .
예를 들어, 실행 Exec sp_help 'sys.tables'
하면 열 name
이 다음과 같이 정의되어 있음을 알 수 있습니다. sysname
이 값은 실제로 그 자체로 개체이기 때문에 (테이블)
나는 그것에 대해 너무 걱정할 것입니다.
SQL Server 6.5 이하 버전을 사용하는 사람들 (아직 사람들이 사용하고 있습니까?)에 내장 된 유형 sysname
은 다음과 같습니다.varchar(30)
선적 서류 비치
sysname
는 비고 섹션에서 nchar
및에nvarchar
대한 문서를 통해 정의됩니다 .
sysname 은 nvarchar (128) 과 기능적으로 동등한 시스템 제공 사용자 정의 데이터 유형 이며 널 입력 가능하지 않습니다. sysname 은 데이터베이스 오브젝트 이름을 참조하는 데 사용됩니다.
위의 설명을 명확히하기 위해 기본적으로 sysname 은 NOT NULL
nullable로 정의 할 수 있으므로 정의됩니다. 정확한 정의는 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이 아니기 때문에)이 될 것이라고 보장하지는 않습니다!
sysname
스크립트 앞으로 (뒤로)의 호환성을 위해.
nvarchar(max)
SP에서 null이 아닌 열로 선언 되었지만 sysname
sys 테이블 에는 으로 표시됩니다 .
sys.types
그것은이다 nvarchar(256) not null
. 시스템 유형 ID = 231 (nvarchar)입니다. 요즘은 TDS에서 유형 별명으로 작동합니다. 별칭의 첫 번째 ID는 256이며 이는에 해당합니다 sysname
. 사용법은 : 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
sys.types
사용자가 생성 한 사용자 정의 유형도 보유합니다 . 그렇게 create type MyInt from int
하면와 함께 두 개의 행이 system_type_id = 56
있습니다. 기본적으로 복제되는 또 다른 하나는 240이며 hierarchyid, geometry 및 geography의 시스템 유형입니다.
where typ.name<>'sysname'
내가 알지 못하는 다른 종류의 결과를 얻을 수 있습니까?
아래에 사용 사례를 나열하겠습니다. 도움이 되길 바랍니다. 여기서 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
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을 지정해야합니다.
또 다른 사용 사례는 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
오류를 유발할 것이라고 선언 ).
제공 할 수있는 사용 사례가 있습니까?
데이터베이스 유지 보수 스크립트에서 사용하기 위해 오브젝트 이름을 저장하려는 곳. 예를 들어, 스크립트는 날짜 열이있는 특정 테이블에서 오래된 행을 제거합니다. 테이블 이름, 필터링 할 열 이름 및 보존 기간 (일)을 제공하는 테이블로 구성됩니다. 다른 스크립트는 특정 테이블을 CSV 파일로 덤프하고 다시 덤프 할 테이블을 나열하는 테이블로 구성됩니다. 이 구성 테이블은 sysname
유형을 사용하여 테이블 및 열 이름을 저장할 수 있습니다 .
nvarchar(128) not null
열을 사용하십시오 . 이름은 바로 그 이름입니다. 그것은 할 필요가 없습니다 sysname
사용
nvarchar(300)
조차 varchar
없으며 테이블 이름에 유니 코드를 사용하지 않아도 (아무도 아무도 모르기 때문에) 작동합니다. 장점 sysname
은 부분적으로 의도를 명확하게한다는 것입니다.이 열에는 개체 이름이 있습니다. 그리고 부분적으로 이전에 발생한 것처럼 개체 이름에 사용 된 데이터 형식을 변경하는 다른 버전의 MSSQL로 마이그레이션하더라도 계속 올바른 형식이됩니다.
nvarchar(128) NOT NULL
입니다. 실제로 user_type_id
열의 값 을 확인하여 유형을 찾는 방법 입니다. 당신 은 당신 자신의 사용자 타입을 생성하는 것보다 그 타입을 사용함으로써 더 이상 아무것도 얻지 못합니다
sysname
새로운 MSSQL 버전에서 정의 가 변경되고 데이터베이스가 새로운 인스턴스로 백업 및 복원 된 경우 이전에 있었던 모든 열 sysname
이 이제 잘못된 유형이고 더 이상 사용 된 유형과 일치하지 않음 을 의미합니까? 시스템 테이블에?
sysname
의 사용자 정의 형식입니다 . 변경할 수있는 방법이 없습니다. 새 유형을 작성하고 이전 유형을 사용한 모든 열을 새 유형으로 변경해야합니다. MS가이를 변경하기로 결정하면 그들은 줄 새로운 유형의 기존 시스템 테이블의 데이터를 마이그레이션해야합니다. 이미 알고있는 시스템 테이블에 대해이 작업을 수행 할 것으로 예상 할 수 있지만 모든 사용자 테이블은 사용자 가 마이그레이션해야합니다.usert_type_id
ALTER TYPE