none
请问如何把系统存储过程返回的结果存到表中? RRS feed

答案

  • 对于多结果集,可借用客户端工具(C#、VB、DELPHI等),其ADO查询组件有nextrecordset,可以获取下一个结果集

    另一个思路是查询DMV,分别获取相应的值,更灵活


    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴

    • 已标记为答案 Tim-2009 2018年7月9日 6:10
    2018年7月6日 2:30
  • 写程序或脚本,在 SQL 中无法直接搞定
    • 已标记为答案 Tim-2009 2018年7月9日 6:10
    2018年7月6日 3:13
  • SqlDataAdapter.Fill(DataSet dataSet) 调用这个方法可以存到2个DataTable中。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    • 已标记为答案 Tim-2009 2018年7月9日 6:10
    2018年7月9日 0:29
  • --  EXEC  [sp_ShowTableSize]  ' '

    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_ShowTableSize]') AND type in (N'P', N'PC'))
    BEGIN
    EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_ShowTableSize] AS' 
    END
    GO 


    ALTER PROCEDURE [dbo].[sp_ShowTableSize](
      @dbname NVARCHAR(60)) 

    AS 

    BEGIN 

    CREATE TABLE #tablespaceinfo
        (
          nameinfo VARCHAR(500) ,
          rowsinfo BIGINT ,
          reserved VARCHAR(20) ,
          datainfo VARCHAR(20) ,
          index_size VARCHAR(20) ,
          unused VARCHAR(20)
        )  
     
    DECLARE @tablename VARCHAR(255);  
     
    DECLARE Info_cursor CURSOR
    FOR
        SELECT  '[' + [name] + ']'
        FROM    sys.tables
        WHERE   type = 'U';  
     
    OPEN Info_cursor  
    FETCH NEXT FROM Info_cursor INTO @tablename  
     
    WHILE @@FETCH_STATUS = 0
        BEGIN 
            INSERT  INTO #tablespaceinfo
                    EXEC sp_spaceused @tablename  
            FETCH NEXT FROM Info_cursor  
        INTO @tablename  
        END 
     
    CLOSE Info_cursor  
    DEALLOCATE Info_cursor  
     

    CREATE TABLE [#tmptb]
        (
          TableName VARCHAR(50) ,
          DataInfo BIGINT ,
          RowsInfo BIGINT ,
          Spaceperrow  AS ( CASE RowsInfo
                             WHEN 0 THEN 0
                             ELSE CAST(DataInfo AS decimal(18,2))/CAST(RowsInfo AS decimal(18,2))
                           END ) PERSISTED
        )


    INSERT  INTO [#tmptb]
            ( [TableName] ,
              [DataInfo] ,
              [RowsInfo]
            )
            SELECT  [nameinfo] ,
                    CAST(REPLACE([datainfo], 'KB', '') AS BIGINT) AS 'datainfo' ,
                    [rowsinfo]
            FROM    #tablespaceinfo
            ORDER BY CAST(REPLACE(reserved, 'KB', '') AS INT) DESC  



    SELECT  [tbspinfo].* ,
            [tmptb].[Spaceperrow] AS '每行记录大概占用空间(KB)'
    FROM    [#tablespaceinfo] AS tbspinfo ,
            [#tmptb] AS tmptb
    WHERE   [tbspinfo].[nameinfo] = [tmptb].[TableName] 
            AND [tbspinfo].rowsinfo>0
    ORDER BY CAST(REPLACE([tbspinfo].[reserved], 'KB', '') AS INT) DESC  

    --DROP TABLE [#tablespaceinfo]
    --DROP TABLE [#tmptb]

    END 


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    • 已标记为答案 Tim-2009 2018年7月9日 6:10
    2018年7月9日 0:32

全部回复

  • 对于多结果集,可借用客户端工具(C#、VB、DELPHI等),其ADO查询组件有nextrecordset,可以获取下一个结果集

    另一个思路是查询DMV,分别获取相应的值,更灵活


    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴

    • 已标记为答案 Tim-2009 2018年7月9日 6:10
    2018年7月6日 2:30
  • 写程序或脚本,在 SQL 中无法直接搞定
    • 已标记为答案 Tim-2009 2018年7月9日 6:10
    2018年7月6日 3:13
  • SqlDataAdapter.Fill(DataSet dataSet) 调用这个方法可以存到2个DataTable中。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    • 已标记为答案 Tim-2009 2018年7月9日 6:10
    2018年7月9日 0:29
  • --  EXEC  [sp_ShowTableSize]  ' '

    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_ShowTableSize]') AND type in (N'P', N'PC'))
    BEGIN
    EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_ShowTableSize] AS' 
    END
    GO 


    ALTER PROCEDURE [dbo].[sp_ShowTableSize](
      @dbname NVARCHAR(60)) 

    AS 

    BEGIN 

    CREATE TABLE #tablespaceinfo
        (
          nameinfo VARCHAR(500) ,
          rowsinfo BIGINT ,
          reserved VARCHAR(20) ,
          datainfo VARCHAR(20) ,
          index_size VARCHAR(20) ,
          unused VARCHAR(20)
        )  
     
    DECLARE @tablename VARCHAR(255);  
     
    DECLARE Info_cursor CURSOR
    FOR
        SELECT  '[' + [name] + ']'
        FROM    sys.tables
        WHERE   type = 'U';  
     
    OPEN Info_cursor  
    FETCH NEXT FROM Info_cursor INTO @tablename  
     
    WHILE @@FETCH_STATUS = 0
        BEGIN 
            INSERT  INTO #tablespaceinfo
                    EXEC sp_spaceused @tablename  
            FETCH NEXT FROM Info_cursor  
        INTO @tablename  
        END 
     
    CLOSE Info_cursor  
    DEALLOCATE Info_cursor  
     

    CREATE TABLE [#tmptb]
        (
          TableName VARCHAR(50) ,
          DataInfo BIGINT ,
          RowsInfo BIGINT ,
          Spaceperrow  AS ( CASE RowsInfo
                             WHEN 0 THEN 0
                             ELSE CAST(DataInfo AS decimal(18,2))/CAST(RowsInfo AS decimal(18,2))
                           END ) PERSISTED
        )


    INSERT  INTO [#tmptb]
            ( [TableName] ,
              [DataInfo] ,
              [RowsInfo]
            )
            SELECT  [nameinfo] ,
                    CAST(REPLACE([datainfo], 'KB', '') AS BIGINT) AS 'datainfo' ,
                    [rowsinfo]
            FROM    #tablespaceinfo
            ORDER BY CAST(REPLACE(reserved, 'KB', '') AS INT) DESC  



    SELECT  [tbspinfo].* ,
            [tmptb].[Spaceperrow] AS '每行记录大概占用空间(KB)'
    FROM    [#tablespaceinfo] AS tbspinfo ,
            [#tmptb] AS tmptb
    WHERE   [tbspinfo].[nameinfo] = [tmptb].[TableName] 
            AND [tbspinfo].rowsinfo>0
    ORDER BY CAST(REPLACE([tbspinfo].[reserved], 'KB', '') AS INT) DESC  

    --DROP TABLE [#tablespaceinfo]
    --DROP TABLE [#tmptb]

    END 


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    • 已标记为答案 Tim-2009 2018年7月9日 6:10
    2018年7月9日 0:32