首页 > 解决方案 > 从 SQL 中的表/视图中读取以多行编写的列名定义

问题描述

column namesview.

SELECT
CAST(CONCAT('Trp', f.Production_disposal_Number, p.production_waste_number,p.production_shiftchange_number, t.production_unit_number,pr.process_unit_number,p.production_run_number  AS VARCHAR(50)) AS ProductionKey
,(SELECT MAX(v.LastModifiedDate) FROM (VALUES (p.LastModifiedDate), (f.LastModifiedDate), (p.LastModifiedDate), 
(d.LastModifiedDate), (pl.LastModifiedDate), (pr.LastModifiedDate), (t.LastModifiedDate)) AS vtable(LastModifiedDate)) 
AS LastModifiedDate
,CAST(p.Start_Date AS DATETIME2(0)) AS ProductionStartDate, CAST(p.End_Date AS DATETIME2(0)) AS ProductionEndDate

我想通过在我的程序column names中传递以下sql查询来检索这些C#

query=        
    "@DECLARE
     @olddelim nvarchar(32) = char(13) + Char(10),
     @newdelim nchar(1)     = NCHAR(9999); 
     SELECT * FROM STRING_SPLIT(REPLACE(OBJECT_DEFINITION(object_id('sge.vwProduct')),@olddelim, @newdelim), @newdelim);";

using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand command = new SqlCommand(queryString, connection);
                connection.Open();
                SqlDataReader reader = command.ExecuteReader();
                try
                {
                    while (reader.Read())
                        list.Add(reader.GetString(0));
                }
                finally
                {
                    reader.Close();
                    connection.Close();
                }
            }

code仅当所有内容都在单行时才能正常运行column names。但是,如果将单列定义写在多行中,则它无法读取column name. 此外,如果多个列名写在一行中,它也不会读取。

例如,列名LastModifiedDate既不能被程序识别也不能被程序读取,因为它不能识别列定义的开始。并以同样的方式ProductionStartDate不读。

我希望所有column names内容都能被正确识别并被程序读取,以免遗漏任何列名。

标签: c#sqltsqlsqldatareader

解决方案


更改您的查询。您可以轻松地从字典中查询视图的列名。无需为此目的“解析” create 语句。

SELECT c.name
       FROM sys.columns c
            INNER JOIN sys.views v
                       ON c.object_id = v.object_id
            INNER JOIN sys.schemas s
                       ON s.schema_id = v.schema_id
       WHERE s.name = 'sge'
             AND v.name = 'vwProduct'
       ORDER BY c.column_id;

db<>fiddle(具有不同的对象名称;但它应该足以作为演示)

但请注意,它SqlDataReader是一次性的,因此您应该Dispose()使用它或using像连接时那样使用它。


推荐阅读