[sql] SQL Server : 모든 대문자를 적절한 대소 문자 / 제목 대소 문자로 설정
모두 대문자로 가져온 테이블이 있는데 적절한 케이스로 바꾸고 싶습니다. 이 작업을 완료하는 데 사용한 스크립트는 무엇입니까?
답변
트릭을 수행 할 UDF가 있습니다.
create function ProperCase(@Text as varchar(8000))
returns varchar(8000)
as
begin
declare @Reset bit;
declare @Ret varchar(8000);
declare @i int;
declare @c char(1);
if @Text is null
return null;
select @Reset = 1, @i = 1, @Ret = '';
while (@i <= len(@Text))
select @c = substring(@Text, @i, 1),
@Ret = @Ret + case when @Reset = 1 then UPPER(@c) else LOWER(@c) end,
@Reset = case when @c like '[a-zA-Z]' then 0 else 1 end,
@i = @i + 1
return @Ret
end
그래도 데이터를 업데이트하는 데 사용해야합니다.
답변
이 기능 :
- 공백으로 구분 된 모든 “UPPER CASE”단어 “적절한 대소 문자”
- “소문자 단어”만 남겨 둡니다.
- 영어가 아닌 알파벳에서도 제대로 작동합니다.
- 최신 SQL 서버 버전의 멋진 기능을 사용하지 않는다는 점에서 이식성이 있습니다.
- 유니 코드 지원을 위해 NCHAR 및 NVARCHAR을 사용하도록 쉽게 변경할 수있을뿐만 아니라 적합한 매개 변수 길이도 사용할 수 있습니다.
- 공백 정의를 구성 할 수 있습니다.
CREATE FUNCTION ToProperCase(@string VARCHAR(255)) RETURNS VARCHAR(255)
AS
BEGIN
DECLARE @i INT -- index
DECLARE @l INT -- input length
DECLARE @c NCHAR(1) -- current char
DECLARE @f INT -- first letter flag (1/0)
DECLARE @o VARCHAR(255) -- output string
DECLARE @w VARCHAR(10) -- characters considered as white space
SET @w = '[' + CHAR(13) + CHAR(10) + CHAR(9) + CHAR(160) + ' ' + ']'
SET @i = 1
SET @l = LEN(@string)
SET @f = 1
SET @o = ''
WHILE @i <= @l
BEGIN
SET @c = SUBSTRING(@string, @i, 1)
IF @f = 1
BEGIN
SET @o = @o + @c
SET @f = 0
END
ELSE
BEGIN
SET @o = @o + LOWER(@c)
END
IF @c LIKE @w SET @f = 1
SET @i = @i + 1
END
RETURN @o
END
결과:
dbo.ToProperCase('ALL UPPER CASE and SOME lower ÄÄ ÖÖ ÜÜ ÉÉ ØØ ĈĈ ÆÆ')
-----------------------------------------------------------------
All Upper Case and Some lower Ää Öö Üü Éé Øø Cc Ææ
답변
UPDATE titles
SET title =
UPPER(LEFT(title, 1)) +
LOWER(RIGHT(title, LEN(title) - 1))
답변
SQL Server에서 CLR을 활성화 할 수있는 경우 (2005 이상 필요) TextInfo.ToTitleCase 기본 제공 함수 를 사용 하는 CLR 함수 를 만들 수 있습니다.이 함수 를 사용하면 몇 번만 문화 인식 방식으로이를 수행 할 수 있습니다. 코드 줄.
답변
나는 이것이이 스레드의 늦은 게시물이라는 것을 알고 있지만 볼 가치가 있습니다. 이 기능은 항상 나를 위해 작동합니다. 그래서 그것을 공유하는 것을 생각했습니다.
CREATE FUNCTION [dbo].[fnConvert_TitleCase] (@InputString VARCHAR(4000) )
RETURNS VARCHAR(4000)
AS
BEGIN
DECLARE @Index INT
DECLARE @Char CHAR(1)
DECLARE @OutputString VARCHAR(255)
SET @OutputString = LOWER(@InputString)
SET @Index = 2
SET @OutputString = STUFF(@OutputString, 1, 1,UPPER(SUBSTRING(@InputString,1,1)))
WHILE @Index <= LEN(@InputString)
BEGIN
SET @Char = SUBSTRING(@InputString, @Index, 1)
IF @Char IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&','''','(')
IF @Index + 1 <= LEN(@InputString)
BEGIN
IF @Char != ''''
OR
UPPER(SUBSTRING(@InputString, @Index + 1, 1)) != 'S'
SET @OutputString =
STUFF(@OutputString, @Index + 1, 1,UPPER(SUBSTRING(@InputString, @Index + 1, 1)))
END
SET @Index = @Index + 1
END
RETURN ISNULL(@OutputString,'')
END
테스트 호출 :
select dbo.fnConvert_TitleCase(Upper('ÄÄ ÖÖ ÜÜ ÉÉ ØØ ĈĈ ÆÆ')) as test
select dbo.fnConvert_TitleCase(upper('Whatever the mind of man can conceive and believe, it can achieve. – Napoleon hill')) as test
결과 :
답변
나는 게임에 조금 늦었지만 이것이 더 기능적이며 러시아어, 독일어, 태국어, 베트남어 등 모든 언어에서 작동한다고 생각합니다. ‘또는-또는. 또는 (또는) 또는 공백 (분명히 :).
CREATE FUNCTION [dbo].[fnToProperCase]( @name nvarchar(500) )
RETURNS nvarchar(500)
AS
BEGIN
declare @pos int = 1
, @pos2 int
if (@name <> '')--or @name = lower(@name) collate SQL_Latin1_General_CP1_CS_AS or @name = upper(@name) collate SQL_Latin1_General_CP1_CS_AS)
begin
set @name = lower(rtrim(@name))
while (1 = 1)
begin
set @name = stuff(@name, @pos, 1, upper(substring(@name, @pos, 1)))
set @pos2 = patindex('%[- ''.)(]%', substring(@name, @pos, 500))
set @pos += @pos2
if (isnull(@pos2, 0) = 0 or @pos > len(@name))
break
end
end
return @name
END
GO
답변
대소 문자가 혼합 된 데이터를 가져 오는 SSIS에서 적절한 대소 문자가있는 열에 대한 조회를 수행해야하는 경우 원본이 혼합되고 조회 원본이 적절한 경우 조회가 실패 함을 알 수 있습니다. 또한 파생 열에 대한 SQL Server 2008r2 용 SSIS는 오른쪽 및 왼쪽 함수를 사용할 수 없습니다. 저에게 적합한 솔루션은 다음과 같습니다.
UPPER(substring(input_column_name,1,1)) + LOWER(substring(input_column_name, 2, len(input_column_name)-1))