SQL Server SYSNAME 데이터 유형은 무엇입니까? BOL의 말 :
sysname 데이터 형식은 개체 이름을 저장하는 테이블 열, 변수 및 저장 프로 시저 매개 변수에 사용됩니다.
그러나 나는 그것을 정말로 얻지 못한다. 제공 할 수있는 사용 사례가 있습니까?
답변
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이 아니기 때문에)이 될 것이라고 보장하지는 않습니다!
답변
제공 할 수있는 사용 사례가 있습니까?
동적 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
답변
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을 지정해야합니다.
답변
다음과 같은 방법으로 데이터베이스를 탐색하려는 경우 다음과 같이 유용한 시스템 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
오류를 유발할 것이라고 선언 ).