【问题标题】:Select Data with Column's Description not null, and then replace column name with description选择列描述不为空的数据,然后将列名替换为描述
【发布时间】:2017-07-09 15:29:42
【问题描述】:

我有一个表“PurchaseOrder”。当列的描述不为空时,我想选择数据。然后用它的描述替换列的名称。

表 PurchaseOrder

ID | Product    |  Use    |   Price   |  Comment 
-----------------------------------------------------
1  | Cellphone  |  true   |   100     |   
2  | Car        |  false  |   10      |   
3  | Table      |  true   |   200     |   

栏目

Name      |    Description
---------------------------
ID        |    Index
Produce   |    Name
Use       |    
Price     |    Sale
Comment   |

选择结果将是

Index  |   Name      |    Sale
--------------------------------
1      |   Cellphone |    100        
2      |   Car       |    10         
3      |   Table     |    200    

现在,我只得到带有描述的列

if object_id('tempdb..#dt') is not null drop table #dt
select 
    sc.column_id [Position],
    sc.name [Column],
    sc.max_length [Length],
    sep.value [Description]
into #dt
from sys.tables st
inner join sys.columns sc on st.object_id = sc.object_id
left join sys.extended_properties sep on st.object_id = sep.major_id
                                     and sc.column_id = sep.minor_id
                                     and sep.name = 'MS_Description'
where st.name = 'PurchaseOrder' and sep.value is not null 

如何生成最终的数据表?

【问题讨论】:

  • 这看起来应该在应用程序而不是数据库级别处理。 Description 可能匹配另一个列名,列名有不方便的字符,...。我倾向于编写一个存储过程,它返回两个记录集(描述和数据)或一个带有描述的输出参数和一个带有数据的记录集。
  • 是的,如果由应用程序处理会更容易。我只是想知道它真的不能通过存储过程处理吗?
  • 如果我正确理解了您的问题,我在下面发布的代码应该会产生预期的结果。
  • @JasonByrd,你解决它。

标签: c# sql-server tsql


【解决方案1】:
DECLARE 
@TABLE_NAME NVARCHAR(50) = 'PurchaseOrderDetail', 
@TABLE_SCHEMA Nvarchar(50) = 'Purchasing',
@COL_LIST NVARCHAR(MAX),
@SQL NVARCHAR(4000), 
@COL NVARCHAR(500) 

DECLARE c_cursor CURSOR FOR        
SELECT sc.name + ' as ' + QUOTENAME(CAST(sep.value AS varchar)) AS Expr1
FROM   sys.tables AS st INNER JOIN
       sys.columns AS sc ON st.object_id = sc.object_id INNER JOIN
       sys.extended_properties AS sep ON st.object_id = sep.major_id AND sc.column_id = sep.minor_id AND sep.name = 'MS_Description'
WHERE st.name = @TABLE_NAME AND sep.value IS NOT NULL

OPEN c_cursor; 
FETCH NEXT 
FROM c_cursor INTO @COL; 
WHILE ( @@FETCH_STATUS = 0 ) 
BEGIN 
SELECT @COL_LIST = COALESCE(@COL_LIST+',' ,'') + @COL
FETCH NEXT FROM c_cursor 
INTO @col; 
END CLOSE c_cursor; 
DEALLOCATE c_cursor; 

SET @SQL = ' SELECT ' + @COL_LIST +' FROM ' + QUOTENAME(@TABLE_SCHEMA)+'.'+QUOTENAME(@TABLE_NAME) 
PRINT @SQL;
EXEC (@sql); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2021-04-24
    • 1970-01-01
    • 2012-08-20
    • 2015-08-11
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多