日期:2014-05-18  浏览次数:20483 次

sql 2000 表值函数 无法传 字段作为参数
在sql 2000 中建立一个表值函数用于将字符串分割成表形式 但是遇到“不是可以识别的 OPTIMIZER LOCK HINTS 选项”
请高手指点下

CREATE TABLE [dbo].[aaaa](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
 CONSTRAINT [PK_aaaa] PRIMARY KEY CLUSTERED 
(
[id] ASC
) ON [PRIMARY]
) ON [PRIMARY]

insert INTO [aaaa] values('1')
insert INTO [aaaa] values('1,2')
insert INTO [aaaa] values('1')
insert INTO [aaaa] values('1,2')


select * from aaaa
where (select count(*) from dbo.f_Split(name,','))>0

select * from dbo.f_Split(1,',')




/*  
实现split功能的函数  
*/  
CREATE function f_Split  
(  
 @SourceSql varchar(8000),  
 @StrSeprate varchar(10)  
)  
returns @temp table(Item varchar(100))  
as  
begin  
  declare @i int  
  set @SourceSql=rtrim(ltrim(@SourceSql))  
  set @i=charindex(@StrSeprate,@SourceSql)  
  while @i>=1  
  begin  
  insert @temp values(left(@SourceSql,@i-1))  
  set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)  
  set @i=charindex(@StrSeprate,@SourceSql)  
  end  
  if @SourceSql<>'' insert @temp values(@SourceSql)  
  delete from @temp where len(Item)=0  
  return  
end

------解决方案--------------------
insert @temp values(left(@SourceSql,@i-1))
这个表名是变量的应该拼接动态sql
------解决方案--------------------
--方法一;
ALTER DATABASE '数据库名' SET COMPATIBILITY_LEVEL = 90

GO

--法二:

EXEC sp_dbcmptlevel 'SD70101N_2009斯将利',90

GO


------解决方案--------------------
SQL code

/****************************************************************************************************************************************************** 
合并分拆表数据 

整理人:中国风(Roy) 

日期:2008.06.06 
******************************************************************************************************************************************************/ 

--> --> (Roy)生成測試數據 

if not object_id('Tab') is null 
    drop table Tab 
Go 
Create table Tab([Col1] int,[Col2] nvarchar(1)) 
Insert Tab 
select 1,N'a' union all 
select 1,N'b' union all 
select 1,N'c' union all 
select 2,N'd' union all 
select 2,N'e' union all 
select 3,N'f' 
Go 

合并表: 

SQL2000用函数: 

go 
if object_id('F_Str') is not null 
    drop function F_Str 
go 
create function F_Str(@Col1 int) 
returns nvarchar(100) 
as 
begin 
    declare @S nvarchar(100) 
    select @S=isnull(@S+',','')+Col2 from Tab where Col1=@Col1 
    return @S 
end 
go 
Select distinct Col1,Col2=dbo.F_Str(Col1) from Tab 

go 

SQL2005用XML: 

方法1: 

select 
    a.Col1,Col2=stuff(b.Col2.value('/R[1]','nvarchar(max)'),1,1,'') 
from 
    (select distinct COl1 from Tab) a 
Cross apply 
    (select COl2=(select N','+Col2 from Tab where Col1=a.COl1 For XML PATH(''), ROOT('R'), TYPE))b 

方法2: 

select 
    a.Col1,COl2=replace(b.Col2.value('/Tab[1]','nvarchar(max)'),char(44)+char(32),char(44)) 
from 
    (select distinct COl1 from Tab) a 
cross apply 
    (select Col2=(select COl2 from Tab  where COl1=a.COl1 FOR XML AUTO, TYPE) 
                .query(' <Tab> 
                {for $i in /Tab[position() <last()]/@COl2 return concat(string($i),",")} 
                {concat("",string(/Tab[last()]/@COl2))} 
                </Tab>') 
                )b 

SQL05用CTE: 

;with roy as(select Col1,Col2,row=row_number()over(partition by COl1 order by COl1) from Tab) 
,Roy2 as 
(select COl1,cast(COl2 as nvarchar(10