想問一下,你的Stored procedure最後返回的這個交叉表是不是通過一句SELECT弄出來的???

解决方案 »

  1.   

    ★★★★★★★★★Stored procedure★★★★★★★★★CREATE procedure CorssTab 
    @strTabName as varchar(50) = 'Employees', --此处放表名
    @strCol as varchar(50) = 'City',                       --表头分组依据字段
    @strGroup as varchar(50) = 'TitleOfCourtesy',--分组字段
    @strNumber as varchar(50) = 'ReportsTo',    --被统计的字段
    @strSum as varchar(10) = 'Sum'                     --运算方式
    ASDECLARE @strSql as varchar(1000), @strTmpCol as varchar(100)
    EXECUTE ('DECLARE corss_cursor CURSOR FOR SELECT DISTINCT ' + @strCol + ' from ' + @strTabName + ' for read only ') --生成游标
    begin
      SET nocount ON 
      SET @strsql ='select ' + @strGroup + ', ' + @strSum + '(' + @strNumber + ') AS [' + @strSum + ' of ' + @strNumber + ']' --查询的前半段  OPEN corss_cursor
      while (0=0)
      BEGIN
        FETCH NEXT FROM corss_cursor --遍历游标,将列头信息放入变量@strTmpCol
        INTO @strTmpCol
        if (@@fetch_status<>0) break
              SET @strsql = @strsql + ', ' + @strSum + '(CASE ' + @strCol + ' WHEN ''' + @strTmpCol + ''' THEN ' + @strNumber + ' ELSE Null END) AS [' + @strTmpCol + ' ' + @strCol + ']' --构造查询
      END
            SET @strsql = @strsql + ' from ' + @strTabname + ' group by ' + @strGroup --查询结尾  EXECUTE(@strsql) --执行
      IF @@error <>0 RETURN @@error --如果出错,返回错误代码
      CLOSE corss_cursor 
      DEALLOCATE corss_cursor RETURN 0 --释放游标,返回0表示成功end
    GO
      

  2.   

    真的要這樣子做也是有方法的。但是比較煩!!!!(1)、
    執行:
    Exec sp_serveroption '你的SQLServer名字','data access','true'(2)、
    你的Stored procedure必須建在Master資料庫中(記住,一定要在這里)(3)、
    create view viTest as 
    select * from openrowset('SQLOLEDB','NIpsan' ; 'sa' ; '','exec Corsstab ')GO基本上,view就這樣建完了。 關於第二步的做法,我現在不是很確定,因我現在試的只有是建在master庫中才有效。
      

  3.   

    補充一下:上面的是SQL Server3000的做法。 
      

  4.   

    KAO…今天真倒霉,老是打錯字。 >>>>是SQL 2000.
      

  5.   

    (3)、
    create view viTest as 
    select * from openrowset('SQLOLEDB','NIpsan' ; 'sa' ; '','exec Corsstab ')>>>>把'NIpsan'改成你的SQL Server的名字。CSDN真是可惡!要換個ID才可發言!!!
      

  6.   

    to 狼兄:
       不行的,SQL2K的UDF里不支持Exec,所以這問題不能用UDF.
      

  7.   

    给一个样板,内容由你自己修改正确,主要将sp改造为函数:
    ------------------------------------------------------
    CREATE function  dbo.CorssTab 
    (
    @strTabName as varchar(50) = 'Employees', --此处放表名
    @strCol as varchar(50) = 'City',                       --表头分组依据字段
    @strGroup as varchar(50) = 'TitleOfCourtesy',--分组字段
    @strNumber as varchar(50) = 'ReportsTo',    --被统计的字段
    @strSum as varchar(10) = 'Sum' 
    )
    RETURNS table
    AS
    begin --下面要你自己改了
    DECLARE @strSql as varchar(1000), @strTmpCol as varchar(100)
    EXECUTE ('DECLARE corss_cursor CURSOR FOR SELECT DISTINCT ' + @strCol + ' from ' + @strTabName + ' for read only ') --生成游标
    begin
      SET nocount ON 
      SET @strsql ='select ' + @strGroup + ', ' + @strSum + '(' + @strNumber + ') AS [' + @strSum + ' of ' + @strNumber + ']' --查询的前半段  OPEN corss_cursor
      while (0=0)
      BEGIN
        FETCH NEXT FROM corss_cursor --遍历游标,将列头信息放入变量@strTmpCol
        INTO @strTmpCol
        if (@@fetch_status<>0) break
              SET @strsql = @strsql + ', ' + @strSum + '(CASE ' + @strCol + ' WHEN ''' + @strTmpCol + ''' THEN ' + @strNumber + ' ELSE Null END) AS [' + @strTmpCol + ' ' + @strCol + ']' --构造查询
      END
            SET @strsql = @strsql + ' from ' + @strTabname + ' group by ' + @strGroup --查询结尾  EXECUTE(@strsql) --执行
      IF @@error <>0 RETURN @@error --如果出错,返回错误代码
      CLOSE corss_cursor 
      DEALLOCATE corss_cursor RETURN 0 --释放游标,返回0表示成功end
    end --
    GO
    --------------------------------------------------------
    调用:
    select * from dbo.CorssTab(实参。)