代码改变世界

SQL Server 的Collate子句的问题….

2018-02-08 11:19  Evan  阅读(44)  评论(0)    收藏  举报

我用到fn_split函数的时候遇到了点问题。

select code,name from dic_specials where code in (select splitvalue from dbo.fn_split('HF,AB',','))

出现:

Server: Msg 446, Level 16, State 9, Line 1 Cannot resolve collation conflict for equal to operation.

查询一些资料和SQL Server关于Collate的问题:

​http://www.itpub.net/748888.html ​http://www.dedecms.com/web-art/shujuku/MS_SQLServer/20070118/38037.html

解决了,就是在定义临时表的时候,对字段最好使用 COLLATE database_default子句,

比如修改后的函数fn_split:

ALTER   FUNCTION [dbo].[fn_split]
(
@splitString varchar(8000),
@splitChar varchar(8000)
)
returns @T table
(
	splitValue varchar(8000) COLLATE database_default
)
AS
begin
	declare	
	@type int,
	@tl varchar(8000),
	@index bigint,
	@splitCharLength int
	
	set @splitString = ltrim((rtrim(@splitString)))
	set @index = charindex(@splitChar, @splitString)
	set @splitCharLength = len(@splitChar)

	while(@index<>0)
	begin
		set @tl = ltrim(rtrim(left(@splitString, @index-1)))
		if @tl<>''
			insert into @T values(@tl)
		set @splitString = right(@splitString, len(@splitString) - @index - (@splitCharLength - 1))
		set @index = charindex(@splitChar, @splitString)
	end

	if @splitString is not null
		insert into @T values(@splitString);
return;
end