用于生成交叉表的存储过程的存储过程 :_)使用起来超简单

以前总是在网上搜一些交叉表生成的相关代码 但是使用起来总是很复杂 看看 刚出炉的东西对你来说是不是有所帮助 :_)

先看看下一个生成的存储过程 :SQLServer2000

Create Procedure [dbo].[pGet_Cross_Simple_Report_For_统计生成表_By_工龄编码_职称编号]
As
--pGet_Cross_By_统计生成表
Begin
--CREATE TABLE [统计生成表](
-- [工龄编码] int NOT NULL,
-- [职称编号] [int] NOT NULL,
-- [统计值] [int] NULL,
-- CONSTRAINT [PK_统计生成表] PRIMARY KEY CLUSTERED
--(
-- [工龄编码] ASC,
-- [职称编号] ASC
--) ON [PRIMARY]
--) ON [PRIMARY]

Declare @SQL        nvarchar(4000)
Declare @SQL_Create nvarchar(2000)
Declare @SQL_Insert nvarchar(2000)
Declare @SQL_InsertValues nvarchar(2000)
Declare @SQL_InsertValuesDeclare nvarchar(2000)
Declare @SQL_Select nvarchar(2000)
Declare @SQL_SetDefaultValues nvarchar(2000)
Select @SQL_Create = 'Declare @AcrossTable Table(a nvarchar(100)'
Select @SQL_Insert = '
Insert into @AcrossTable (a'
Select @SQL_InsertValues  = 'Values ( @a'
Select @SQL_InsertValuesDeclare = 'Declare @a nvarchar(100)
'
Select @SQL_Select = 'Select a'
Select @SQL_SetDefaultValues = 'Select @a = ''''
'
Declare @ColCode int

DECLARE The_I CURSOR FOR Select Distinct 职称编号 From  统计生成表  Order By 职称编号 ASC
OPEN The_I
FETCH NEXT FROM The_I  INTO @ColCode
WHILE @@FETCH_STATUS = 0
BEGIN
 Select @SQL_Create = @SQL_Create + ',b' + Convert(varchar(10),@ColCode)+ ' nvarchar(100)'
 Select @SQL_Insert = @SQL_Insert + ',b' + Convert(varchar(10),@ColCode)
 Select @SQL_InsertValues = @SQL_InsertValues + ',@b' + Convert(varchar(10),@ColCode)
 Select @SQL_InsertValuesDeclare = @SQL_InsertValuesDeclare + 'Declare @b' + Convert(varchar(10),@ColCode) + ' nvarchar(100)
 '
 Select @SQL_Select = @SQL_Select + ',b' + Convert(varchar(10),@ColCode)
 Select @SQL_SetDefaultValues = @SQL_SetDefaultValues + 'Select @b' + Convert(varchar(10),@ColCode) + ' = ''''
 '
 FETCH NEXT FROM The_I  INTO @ColCode
End
CLOSE The_I
DEALLOCATE The_I

--得到动态交叉表的创建语句
--例如:Declare @AcrossTable Table(a nvarchar(100),b1 nvarchar(100),b2 nvarchar(100),b3 nvarchar(100),b4 nvarchar(100),b5 nvarchar(100) )
Select @SQL_Create = @SQL_Create + ' )'

--得到动态交叉表的Insert语句前半部分
--例如: Insert into @AcrossTable (a,b1,b2,b3,b4,b5 )
Select @SQL_Insert = @SQL_Insert + ' )'

--得到动态交叉表的Insert语句后半部分
--例如: Values ( @a,@b1,@b2,@b3,@b4,@b5 )
Select @SQL_InsertValues = @SQL_InsertValues + ' )'

--得到动态交叉表的Select语句
--例如:Select a,b1,b2,b3,b4,b5,b6 From @AcrossTable
Select @SQL_Select = @SQL_Select + ' From @AcrossTable'


Declare @SQL_InsertX nvarchar(2000)
Select  @SQL_InsertX = ''
Declare @SQL_SelectX nvarchar(2000)
Declare @RowCode int
Declare @Value   int
Declare @RowCode_Count int
Declare @Count int
Select  @Count = (Select count(*)  From (Select Distinct 工龄编码 From 统计生成表) a)
Declare The_X Cursor For Select  工龄编码,Count(*) From    统计生成表 Group By 工龄编码 Order By 工龄编码 Asc
OPEN The_X
FETCH NEXT FROM The_X  INTO @RowCode,@RowCode_Count
WHILE  @Count > 0
BEGIN
  Select @SQL_SelectX = 'Select @a =  ' + Convert(varchar(10),@RowCode) + '
 '
  DECLARE The_Y CURSOR FOR
  Select 职称编号,统计值  From  统计生成表 Where 工龄编码 = @RowCode  Order By 职称编号 ASC
  OPEN The_Y
  FETCH NEXT FROM The_Y  INTO @ColCode,@Value
  WHILE @@FETCH_STATUS = 0
  BEGIN
   Select @SQL_SelectX = @SQL_SelectX + 'Select @b' + Convert(varchar(10),@ColCode) + ' = ' + Convert(varchar(10),@Value) + '
 '
   FETCH NEXT FROM The_Y  INTO @ColCode,@Value
  End
  CLOSE The_Y
  DEALLOCATE The_Y
  Select @Count = @Count - 1
  Select @SQL_InsertX = @SQL_InsertX  + '
 '+ @SQL_SelectX + '
 '+ @SQL_Insert + '
 '+ @SQL_InsertValues + '
 '+ @SQL_SetDefaultValues + '
 '
 FETCH NEXT FROM The_X  INTO @RowCode,@RowCode_Count
End
CLOSE The_X
DEALLOCATE The_X

Select @SQL = @SQL_InsertValuesDeclare + '
' + @SQL_Create + '
' + @SQL_InsertX + '
' + @SQL_Select

Print @SQL

Execute (@SQL )

end

结果 :

1   1   2  3   4   5
2   6   7  8   9  10
3 11 12 13 14 15
4 16 17 18 19 20



再给出一个复杂的生成后的存储过程

Create Procedure [dbo].[pGet_Cross_Report_For_统计生成表_By_工龄编码_职称编号]
As
Begin
--CREATE TABLE [工龄工资标准表](
-- [工龄编码] [int] IDENTITY(1,1) NOT NULL,
-- [工龄名称] [nvarchar](40)  NULL

--CREATE TABLE [职称信息表](
-- [职称编号] [int] IDENTITY(1,1) NOT NULL,
-- [职称名称] [nvarchar](40)  NULL

--CREATE TABLE [TableName_By_Stat%>](
-- [工龄编码] [int] NOT NULL,
-- [职称编号] [int] NOT NULL,
-- [统计值] [int] NULL,

Declare @SQL        nvarchar(4000)
Declare @SQL_Create nvarchar(2000)
Declare @SQL_Insert nvarchar(2000)
Declare @SQL_InsertValues nvarchar(2000)
Declare @SQL_InsertValuesDeclare nvarchar(2000)
Declare @SQL_Select nvarchar(2000)
Declare @SQL_Title nvarchar(2000)
Declare @SQL_TitleValues nvarchar(2000)
Declare @SQL_SetDefaultValues nvarchar(2000)
Select @SQL_Create = 'Declare @AcrossTable Table(a nvarchar(100)'
Select @SQL_Insert = '
Insert into @AcrossTable (a'
Select @SQL_InsertValues  = 'Values ( @a'
Select @SQL_InsertValuesDeclare = 'Declare @a nvarchar(100)
'
Select @SQL_Select = 'Select a'
Select @SQL_TitleValues = '
Select @a = '''''
Select @SQL_SetDefaultValues = 'Select @a = ''''
'
Declare @ColCode int
Declare @ColName nvarchar(100)

DECLARE The_I CURSOR FOR Select 职称编号,职称名称 From  职称信息表  Order By 职称编号 ASC
OPEN The_I
FETCH NEXT FROM The_I  INTO @ColCode,@ColName
WHILE @@FETCH_STATUS = 0
BEGIN
 Select @SQL_TitleValues = @SQL_TitleValues + '
 Select @b' + Convert(varchar(10),@ColCode) + ' = ''' + @ColName +''''
 Select @SQL_Create = @SQL_Create + ',b' + Convert(varchar(10),@ColCode)+ ' nvarchar(100)'
 Select @SQL_Insert = @SQL_Insert + ',b' + Convert(varchar(10),@ColCode)
 Select @SQL_InsertValues = @SQL_InsertValues + ',@b' + Convert(varchar(10),@ColCode)
 Select @SQL_InsertValuesDeclare = @SQL_InsertValuesDeclare + 'Declare @b' + Convert(varchar(10),@ColCode) + ' nvarchar(100)
 '
 Select @SQL_Select = @SQL_Select + ',b' + Convert(varchar(10),@ColCode)
 Select @SQL_SetDefaultValues = @SQL_SetDefaultValues + 'Select @b' + Convert(varchar(10),@ColCode) + ' = ''''
 '
 FETCH NEXT FROM The_I  INTO @ColCode,@ColName
End
CLOSE The_I
DEALLOCATE The_I

--得到动态交叉表的创建语句
--例如:Declare @AcrossTable Table(a nvarchar(100),b1 nvarchar(100),b2 nvarchar(100),b3 nvarchar(100),b4 nvarchar(100),b5 nvarchar(100) )
Select @SQL_Create = @SQL_Create + ' )'

--得到动态交叉表的Insert语句前半部分
--例如: Insert into @AcrossTable (a,b1,b2,b3,b4,b5 )
Select @SQL_Insert = @SQL_Insert + ' )'

--得到动态交叉表的Insert语句后半部分
--例如: Values ( @a,@b1,@b2,@b3,@b4,@b5 )
Select @SQL_InsertValues = @SQL_InsertValues + ' )'

--得到动态交叉表的Select语句
--例如:Select a,b1,b2,b3,b4,b5,b6 From @AcrossTable
Select @SQL_Select = @SQL_Select + ' From @AcrossTable'

--得到动态交叉表的Title语句
--例如:Select @a = ''
--  Select @b1 = '员级及以下'
--  Select @b2 = '初级职称'
--  Select @b3 = '中级职称'
--  Select @b4 = '高级职称'
--  Select @b5 = '正高级(相当于正高级)职称'
--  Insert into @AcrossTable (a,b1,b2,b3,b4,b5 )
--  Values ( @a,@b1,@b2,@b3,@b4,@b5 )
Select @SQL_Title = @SQL_TitleValues + '
' + @SQL_Insert + '
' + @SQL_InsertValues

Declare @SQL_InsertX nvarchar(2000)
Select  @SQL_InsertX = ''
Declare @SQL_SelectX nvarchar(2000)
Declare @RowCode int
Declare @Value   int
Declare @RowCode_Count int
Declare @Count int
Select  @Count = Count(*) From 工龄工资标准表
Declare The_X Cursor For Select  工龄编码,Count(*) From    统计生成表 Group By 工龄编码 Order By 工龄编码 Asc
OPEN The_X
FETCH NEXT FROM The_X  INTO @RowCode,@RowCode_Count
WHILE  @Count > 0
BEGIN
  Select @SQL_SelectX = 'Select @a = 工龄名称 From 工龄工资标准表 Where 工龄编码 = ' + Convert(varchar(10),@RowCode) + '
 '
  DECLARE The_Y CURSOR FOR
  Select 职称编号,统计值  From  统计生成表 Where 工龄编码 = @RowCode  Order By 职称编号 ASC
  OPEN The_Y
  FETCH NEXT FROM The_Y  INTO @ColCode,@Value
  WHILE @@FETCH_STATUS = 0
  BEGIN
   Select @SQL_SelectX = @SQL_SelectX + 'Select @b' + Convert(varchar(10),@ColCode) + ' = ' + Convert(varchar(10),@Value) + '
 '
   FETCH NEXT FROM The_Y  INTO @ColCode,@Value
  End
  CLOSE The_Y
  DEALLOCATE The_Y
  Select @Count = @Count - 1
  Select @SQL_InsertX = @SQL_InsertX  + '
 '+ @SQL_SelectX + '
 '+ @SQL_Insert + '
 '+ @SQL_InsertValues + '
 '+ @SQL_SetDefaultValues + '
 '
 FETCH NEXT FROM The_X  INTO @RowCode,@RowCode_Count
End
CLOSE The_X
DEALLOCATE The_X

Select @SQL = @SQL_InsertValuesDeclare + '
' + @SQL_Create + '
' + @SQL_Title + '
' + @SQL_SetDefaultValues + '
' + @SQL_InsertX + '
' + @SQL_Select

Print @SQL

Execute (@SQL )

end


结果:
 员级及以下 初级职称 中级职称 高级职称 正高级(相当于正高级)职称 XX
1-10年工龄                 1              2               3                                             4     5 
11-20年工龄               6              7               8                                             9    10 
21-30年工龄             11            12             13                                           14    15 
大于30年工龄          16            17             18                                            19    20 

---------------------
:_)
现在给出生成这两个存储过程的存储过程

Create Procedure [dbo].[pCreateProcedure_CrossSimpleReport] 
@TableName varchar(100) ,
@RowName varchar(500) ,
@ColumnName varchar(500) ,
@Value  varchar(500)
AS
Begin

--Declare @TableName varchar(100)
--Declare @RowName varchar(500)
--Declare @ColumnName varchar(500)
--Declare @Value  varchar(500)
--
--Select @TableName = '统计生成表'
--Select @RowName = '工龄编码'
--Select @ColumnName = '职称编号'
--Select @Value   = '统计值'
--
--Execute pCreateProcedure_CrossSimpleReport @TableName,@RowName,@ColumnName,@Value
--execute pGet_Cross_Simple_Report_For_统计生成表_By_工龄编码_职称编号
Declare @CreateSQL varchar(8000)

Select @CreateSQL = '

Create Procedure pGet_Cross_Simple_Report_For_<%TableName%>_By_<%RowName%>_<%ColumnName%>
As
--pGet_Cross_By_<%TableName%>
Begin
--CREATE TABLE [<%TableName%>](
-- [<%RowName%>] [int] NOT NULL,
-- [<%ColumnName%>] [int] NOT NULL,
-- [<%Value%>] [int] NULL,
-- CONSTRAINT [PK_<%TableName%>] PRIMARY KEY CLUSTERED
--(
-- [<%RowName%>] ASC,
-- [<%ColumnName%>] ASC
--) ON [PRIMARY]
--) ON [PRIMARY]

Declare @SQL        nvarchar(4000)
Declare @SQL_Create nvarchar(2000)
Declare @SQL_Insert nvarchar(2000)
Declare @SQL_InsertValues nvarchar(2000)
Declare @SQL_InsertValuesDeclare nvarchar(2000)
Declare @SQL_Select nvarchar(2000)
Declare @SQL_SetDefaultValues nvarchar(2000)
Select @SQL_Create = ''Declare @AcrossTable Table(a nvarchar(100)''
Select @SQL_Insert = ''
Insert into @AcrossTable (a''
Select @SQL_InsertValues  = ''Values ( @a''
Select @SQL_InsertValuesDeclare = ''Declare @a nvarchar(100)
''
Select @SQL_Select = ''Select a''
Select @SQL_SetDefaultValues = ''Select @a = ''''''''
''
Declare @ColCode int

DECLARE The_I CURSOR FOR Select Distinct <%ColumnName%> From  <%TableName%>  Order By <%ColumnName%> ASC
OPEN The_I
FETCH NEXT FROM The_I  INTO @ColCode
WHILE @@FETCH_STATUS = 0
BEGIN
 Select @SQL_Create = @SQL_Create + '',b'' + Convert(varchar(10),@ColCode)+ '' nvarchar(100)''
 Select @SQL_Insert = @SQL_Insert + '',b'' + Convert(varchar(10),@ColCode)
 Select @SQL_InsertValues = @SQL_InsertValues + '',@b'' + Convert(varchar(10),@ColCode)
 Select @SQL_InsertValuesDeclare = @SQL_InsertValuesDeclare + ''Declare @b'' + Convert(varchar(10),@ColCode) + '' nvarchar(100)
 ''
 Select @SQL_Select = @SQL_Select + '',b'' + Convert(varchar(10),@ColCode)
 Select @SQL_SetDefaultValues = @SQL_SetDefaultValues + ''Select @b'' + Convert(varchar(10),@ColCode) + '' = ''''''''
 ''
 FETCH NEXT FROM The_I  INTO @ColCode
End
CLOSE The_I
DEALLOCATE The_I

--得到动态交叉表的创建语句
--例如:Declare @AcrossTable Table(a nvarchar(100),b1 nvarchar(100),b2 nvarchar(100),b3 nvarchar(100),b4 nvarchar(100),b5 nvarchar(100) )
Select @SQL_Create = @SQL_Create + '' )''

--得到动态交叉表的Insert语句前半部分
--例如: Insert into @AcrossTable (a,b1,b2,b3,b4,b5 )
Select @SQL_Insert = @SQL_Insert + '' )''

--得到动态交叉表的Insert语句后半部分
--例如: Values ( @a,@b1,@b2,@b3,@b4,@b5 )
Select @SQL_InsertValues = @SQL_InsertValues + '' )''

--得到动态交叉表的Select语句
--例如:Select a,b1,b2,b3,b4,b5,b6 From @AcrossTable
Select @SQL_Select = @SQL_Select + '' From @AcrossTable''


Declare @SQL_InsertX nvarchar(2000)
Select  @SQL_InsertX = ''''
Declare @SQL_SelectX nvarchar(2000)
Declare @RowCode int
Declare @Value   int
Declare @RowCode_Count int
Declare @Count int
Select  @Count = (Select count(*)  From (Select Distinct <%RowName%> From <%TableName%>) a)
Declare The_X Cursor For Select  <%RowName%>,Count(*) From    <%TableName%> Group By <%RowName%> Order By <%RowName%> Asc
OPEN The_X
FETCH NEXT FROM The_X  INTO @RowCode,@RowCode_Count
WHILE  @Count > 0
BEGIN
  Select @SQL_SelectX = ''Select @a =  '' + Convert(varchar(10),@RowCode) + ''
 ''
  DECLARE The_Y CURSOR FOR
  Select <%ColumnName%>,<%Value%>  From  <%TableName%> Where <%RowName%> = @RowCode  Order By <%ColumnName%> ASC
  OPEN The_Y
  FETCH NEXT FROM The_Y  INTO @ColCode,@Value
  WHILE @@FETCH_STATUS = 0
  BEGIN
   Select @SQL_SelectX = @SQL_SelectX + ''Select @b'' + Convert(varchar(10),@ColCode) + '' = '' + Convert(varchar(10),@Value) + ''
 ''
   FETCH NEXT FROM The_Y  INTO @ColCode,@Value
  End
  CLOSE The_Y
  DEALLOCATE The_Y
  Select @Count = @Count - 1
  Select @SQL_InsertX = @SQL_InsertX  + ''
 ''+ @SQL_SelectX + ''
 ''+ @SQL_Insert + ''
 ''+ @SQL_InsertValues + ''
 ''+ @SQL_SetDefaultValues + ''
 ''
 FETCH NEXT FROM The_X  INTO @RowCode,@RowCode_Count
End
CLOSE The_X
DEALLOCATE The_X

Select @SQL = @SQL_InsertValuesDeclare + ''
'' + @SQL_Create + ''
'' + @SQL_InsertX + ''
'' + @SQL_Select

Print @SQL

Execute (@SQL )

end

'

Select @CreateSQL = Replace(@CreateSQL,'<%TableName%>',@TableName) 
Select @CreateSQL = Replace(@CreateSQL,'<%RowName%>',@RowName) 
Select @CreateSQL = Replace(@CreateSQL,'<%ColumnName%>',@ColumnName) 
Select @CreateSQL = Replace(@CreateSQL,'<%Value%>',@Value)  

Print @CreateSQL

Execute(@CreateSQL)

End


+=======================================

Create Procedure [dbo].[pCreateProcedure_CrossReport] 
@TableName_By_Stat varchar(100) ,
@Stat_Value  varchar(500) ,

@TableName_By_Row varchar(100),
@Stat_RowCode varchar(500) ,
@Row_RowName varchar(500),

@TableName_By_Column varchar(100),
@Stat_ColumnCode varchar(500) ,
@Column_RowName varchar(500)
AS
Begin

--Declare @TableName_By_Stat varchar(100)
--Declare @Stat_Value  varchar(500)
--Declare @TableName_By_Row varchar(100)
--Declare @Stat_RowCode varchar(500)
--Declare @Row_RowName varchar(500)
--Declare @TableName_By_Column varchar(100)
--Declare @Stat_ColumnCode varchar(500)
--Declare @Column_RowName varchar(500)
--
--Select @TableName_By_Stat ='统计生成表'
--Select @Stat_Value  ='统计值'
--Select @TableName_By_Row ='工龄工资标准表'
--Select @Stat_RowCode ='工龄编码'
--Select @Row_RowName ='工龄名称'
--Select @TableName_By_Column ='职称信息表'
--Select @Stat_ColumnCode ='职称编号'
--Select @Column_RowName ='职称名称'
--
--Execute [pCreateProcedure_CrossReport] @TableName_By_Stat ,@Stat_Value ,@TableName_By_Row ,@Stat_RowCode ,@Row_RowName ,@TableName_By_Column ,@Stat_ColumnCode ,@Column_RowName
--execute pGet_Cross_Report_For_统计生成表_By_工龄编码_职称编号
Declare @CreateSQL varchar(8000)

Select @CreateSQL ='
Create Procedure pGet_Cross_Report_For_<%TableName_By_Stat%>_By_<%Stat_RowCode%>_<%Stat_ColumnCode%>
As
Begin
--CREATE TABLE [<%TableName_By_Row%>](
-- [<%Stat_RowCode%>] [int] IDENTITY(1,1) NOT NULL,
-- [<%Row_RowName%>] [nvarchar](40)  NULL

--CREATE TABLE [<%TableName_By_Column%>](
-- [<%Stat_ColumnCode%>] [int] IDENTITY(1,1) NOT NULL,
-- [<%Column_RowName%>] [nvarchar](40)  NULL

--CREATE TABLE [TableName_By_Stat%>](
-- [<%Stat_RowCode%>] [int] NOT NULL,
-- [<%Stat_ColumnCode%>] [int] NOT NULL,
-- [<%Stat_Value%>] [int] NULL,

Declare @SQL        nvarchar(4000)
Declare @SQL_Create nvarchar(2000)
Declare @SQL_Insert nvarchar(2000)
Declare @SQL_InsertValues nvarchar(2000)
Declare @SQL_InsertValuesDeclare nvarchar(2000)
Declare @SQL_Select nvarchar(2000)
Declare @SQL_Title nvarchar(2000)
Declare @SQL_TitleValues nvarchar(2000)
Declare @SQL_SetDefaultValues nvarchar(2000)
Select @SQL_Create = ''Declare @AcrossTable Table(a nvarchar(100)''
Select @SQL_Insert = ''
Insert into @AcrossTable (a''
Select @SQL_InsertValues  = ''Values ( @a''
Select @SQL_InsertValuesDeclare = ''Declare @a nvarchar(100)
''
Select @SQL_Select = ''Select a''
Select @SQL_TitleValues = ''
Select @a = ''''''''''
Select @SQL_SetDefaultValues = ''Select @a = ''''''''
''
Declare @ColCode int
Declare @ColName nvarchar(100)

DECLARE The_I CURSOR FOR Select <%Stat_ColumnCode%>,<%Column_RowName%> From  <%TableName_By_Column%>  Order By <%Stat_ColumnCode%> ASC
OPEN The_I
FETCH NEXT FROM The_I  INTO @ColCode,@ColName
WHILE @@FETCH_STATUS = 0
BEGIN
 Select @SQL_TitleValues = @SQL_TitleValues + ''
 Select @b'' + Convert(varchar(10),@ColCode) + '' = '''''' + @ColName +''''''''
 Select @SQL_Create = @SQL_Create + '',b'' + Convert(varchar(10),@ColCode)+ '' nvarchar(100)''
 Select @SQL_Insert = @SQL_Insert + '',b'' + Convert(varchar(10),@ColCode)
 Select @SQL_InsertValues = @SQL_InsertValues + '',@b'' + Convert(varchar(10),@ColCode)
 Select @SQL_InsertValuesDeclare = @SQL_InsertValuesDeclare + ''Declare @b'' + Convert(varchar(10),@ColCode) + '' nvarchar(100)
 ''
 Select @SQL_Select = @SQL_Select + '',b'' + Convert(varchar(10),@ColCode)
 Select @SQL_SetDefaultValues = @SQL_SetDefaultValues + ''Select @b'' + Convert(varchar(10),@ColCode) + '' = ''''''''
 ''
 FETCH NEXT FROM The_I  INTO @ColCode,@ColName
End
CLOSE The_I
DEALLOCATE The_I

--得到动态交叉表的创建语句
--例如:Declare @AcrossTable Table(a nvarchar(100),b1 nvarchar(100),b2 nvarchar(100),b3 nvarchar(100),b4 nvarchar(100),b5 nvarchar(100) )
Select @SQL_Create = @SQL_Create + '' )''

--得到动态交叉表的Insert语句前半部分
--例如: Insert into @AcrossTable (a,b1,b2,b3,b4,b5 )
Select @SQL_Insert = @SQL_Insert + '' )''

--得到动态交叉表的Insert语句后半部分
--例如: Values ( @a,@b1,@b2,@b3,@b4,@b5 )
Select @SQL_InsertValues = @SQL_InsertValues + '' )''

--得到动态交叉表的Select语句
--例如:Select a,b1,b2,b3,b4,b5,b6 From @AcrossTable
Select @SQL_Select = @SQL_Select + '' From @AcrossTable''

--得到动态交叉表的Title语句
--例如:Select @a = ''''
--  Select @b1 = ''员级及以下''
--  Select @b2 = ''初级职称''
--  Select @b3 = ''中级职称''
--  Select @b4 = ''高级职称''
--  Select @b5 = ''正高级(相当于正高级)职称''
--  Insert into @AcrossTable (a,b1,b2,b3,b4,b5 )
--  Values ( @a,@b1,@b2,@b3,@b4,@b5 )
Select @SQL_Title = @SQL_TitleValues + ''
'' + @SQL_Insert + ''
'' + @SQL_InsertValues

Declare @SQL_InsertX nvarchar(2000)
Select  @SQL_InsertX = ''''
Declare @SQL_SelectX nvarchar(2000)
Declare @RowCode int
Declare @Value   int
Declare @RowCode_Count int
Declare @Count int
Select  @Count = Count(*) From <%TableName_By_Row%>
Declare The_X Cursor For Select  <%Stat_RowCode%>,Count(*) From    <%TableName_By_Stat%> Group By <%Stat_RowCode%> Order By <%Stat_RowCode%> Asc
OPEN The_X
FETCH NEXT FROM The_X  INTO @RowCode,@RowCode_Count
WHILE  @Count > 0
BEGIN
  Select @SQL_SelectX = ''Select @a = <%Row_RowName%> From <%TableName_By_Row%> Where <%Stat_RowCode%> = '' + Convert(varchar(10),@RowCode) + ''
 ''
  DECLARE The_Y CURSOR FOR
  Select <%Stat_ColumnCode%>,<%Stat_Value%>  From  <%TableName_By_Stat%> Where <%Stat_RowCode%> = @RowCode  Order By <%Stat_ColumnCode%> ASC
  OPEN The_Y
  FETCH NEXT FROM The_Y  INTO @ColCode,@Value
  WHILE @@FETCH_STATUS = 0
  BEGIN
   Select @SQL_SelectX = @SQL_SelectX + ''Select @b'' + Convert(varchar(10),@ColCode) + '' = '' + Convert(varchar(10),@Value) + ''
 ''
   FETCH NEXT FROM The_Y  INTO @ColCode,@Value
  End
  CLOSE The_Y
  DEALLOCATE The_Y
  Select @Count = @Count - 1
  Select @SQL_InsertX = @SQL_InsertX  + ''
 ''+ @SQL_SelectX + ''
 ''+ @SQL_Insert + ''
 ''+ @SQL_InsertValues + ''
 ''+ @SQL_SetDefaultValues + ''
 ''
 FETCH NEXT FROM The_X  INTO @RowCode,@RowCode_Count
End
CLOSE The_X
DEALLOCATE The_X

Select @SQL = @SQL_InsertValuesDeclare + ''
'' + @SQL_Create + ''
'' + @SQL_Title + ''
'' + @SQL_SetDefaultValues + ''
'' + @SQL_InsertX + ''
'' + @SQL_Select

Print @SQL

Execute (@SQL )

end

'
Select @CreateSQL = Replace(@CreateSQL,'<%TableName_By_Stat%>',@TableName_By_Stat) 
Select @CreateSQL = Replace(@CreateSQL,'<%Stat_Value%>',@Stat_Value) 

Select @CreateSQL = Replace(@CreateSQL,'<%TableName_By_Row%>',@TableName_By_Row) 
Select @CreateSQL = Replace(@CreateSQL,'<%Stat_RowCode%>',@Stat_RowCode) 
Select @CreateSQL = Replace(@CreateSQL,'<%Row_RowName%>',@Row_RowName) 

Select @CreateSQL = Replace(@CreateSQL,'<%TableName_By_Column%>',@TableName_By_Column)  
Select @CreateSQL = Replace(@CreateSQL,'<%Stat_ColumnCode%>',@Stat_ColumnCode) 
Select @CreateSQL = Replace(@CreateSQL,'<%Column_RowName%>',@Column_RowName) 

 


Print @CreateSQL

Execute(@CreateSQL)

End



 

posted @ 2007-02-06 10:31  我想去长安  阅读(2094)  评论(4编辑  收藏  举报