【问题标题】:Dynamic stored procedures Order by Columns Title动态存储过程 按列排序 标题
【发布时间】:2015-09-30 10:12:26
【问题描述】:

我想按该列标题对一个动态存储过程的结果进行排序。

例如我的存储过程返回这个表:

╔══════╦════════╦════╦══════╦═════════════╦═════════════╦════════╗
║ name ║ family ║ id ║ type ║ description ║ create_date ║ row_no ║
╚══════╩════════╩════╩══════╩═════════════╩═════════════╩════════╝

现在,我想创建一个存储过程来执行该动态存储过程,但这次得到一个按列标题排序的结果,如下所示:

╔═════════════╦═════════════╦════════╦════╦══════╦════════╦══════╗
║ create_date ║ description ║ family ║ id ║ name ║ row_no ║ type ║
╚═════════════╩═════════════╩════════╩════╩══════╩════════╩══════╝

我创建了这个问题的答案,但我不确定我的方法是正确还是简单的方法!

我可以比下面的答案更容易地实现这个问题吗?

编辑:

我的答案不适用于XML 数据类型的列!因为OPENQUERY不支持。

【问题讨论】:

    标签: sql-server stored-procedures dynamic sql-order-by


    【解决方案1】:

    这是我的例子,希望对你有所帮助:

    CREATE TABLE [dbo].[Test](
        [text1] [nvarchar](500) NULL,
        [text4] [nvarchar](500) NULL,
        [text3] [nchar](10) NULL
    ) ON [PRIMARY]
    
    GO
    create proc sp_TableOrderBy 
    @tableName varchar(100)
    as
    declare @sql nvarchar(max)
    declare @tableColOrderBy nvarchar(max)
    SELECT @tableColOrderBy = COALESCE(@tableColOrderBy + ', ', '') + Name
    FROM sys.columns
    WHERE object_id = OBJECT_ID(@tableName)
    order by name
    set @sql = 'select ' + @tableColOrderBy + ' from ' + @tableName
    execute sp_executesql @sql
    
    exec sp_TableOrderBy 'Test'
    

    【讨论】:

      【解决方案2】:

      我创建了一个 SP 来执行以下订购步骤:

      • 1) 将动态 SP 结果插入 #TempTable

      • 2) 在 tempdb.sys.[columns] 表中查找我的查询结果列,因为我的 SP 结果现在存储在临时表中。

      • 3) 对创建的列标题进行排序并按此模式将其插入字符串中:

        [col1]、[col2]、[col3]、...

      • 4) 创建一个T-SQL这个模型:

        'SELECT' + '排序的列:[col1], [col2], [col3], ... ' + ' FROM ' + '#temptable'

      • 5) 执行创建 T-SQL 以显示排序的 SP 结果。

      在测试项目中,我的动态 SP 名称是:TestDB.dbo.sp_TEST。 现在Sorter SP代码是:

      /*
       * Run Just Once Time For Set Configures and Create Linked Server
       */
      -- Set Permissions to insert into a temp table
      --sp_configure 'Show Advanced Options', 1
      --GO
      --RECONFIGURE
      --GO
      --sp_configure 'Ad Hoc Distributed Queries', 1
      --GO
      --RECONFIGURE
      --GO
      
      --EXEC sp_addlinkedserver 
      --     @server = 'LOCALSERVER',
      --     @srvproduct = '',
      --     @provider = 'SQLNCLI',
      --     @datasrc = 'Localhost'
      
      
      
      DECLARE @tbl     VARCHAR(MAX) = '#SortedColsTempTable',
              @sql     VARCHAR(MAX)
      
      -- If old temp table is exist then clear that
      IF OBJECT_ID('tempdb..#SortedColsTempTable') IS NOT NULL
          DROP TABLE #SortedColsTempTable
      
      -- Insert your results into #SortedColsTempTable temp table's
      SELECT * INTO #SortedColsTempTable
      FROM   OPENQUERY([LOCALSERVER], 'EXEC TestDb.dbo.sp_TEST 1') 
      
      -- Create a string by sorted columns title
      SET @sql = (
              SELECT '[' + c.name + '], ' AS [text()]
              FROM   tempdb.sys.[columns] c
                     INNER JOIN tempdb.sys.tables t
                          ON  t.[object_id] = c.[object_id]
              WHERE  t.name LIKE '#SortedColsTempTable%'
              ORDER BY
                     c.name
                     FOR XML PATH('')
          )
      
      SET @sql = 'SELECT ' + LEFT(@sql, LEN(@sql) -1) + ' FROM ' + @tbl
      
      EXEC (@sql)
      

      【讨论】:

        猜你喜欢
        • 2013-06-28
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        • 2018-09-08
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多