zoukankan      html  css  js  c++  java
  • 用于生成交叉表的存储过程的存储过程 :_)使用起来超简单

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

    先看看下一个生成的存储过程 :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



     

  • 相关阅读:
    黑苹果崩溃恢复
    黑苹果声音小解决方法
    idea plugin 进度条
    phpstorm 插件
    awesome mac
    webstorm vue eslint 自动修正配置
    Laravel/php 一些调试技巧
    php ZipArchive 压缩整个文件夹
    laravel 模型事件 updated 触发条件
    php 开启 opcache 之后 require、include 还会每次都重新加载文件吗?
  • 原文地址:https://www.cnblogs.com/bigmouthz/p/641720.html
Copyright © 2011-2022 走看看