【问题标题】:Alternative of PRINT output from SQL替代 SQL 的 PRINT 输出
【发布时间】:2016-02-11 08:28:04
【问题描述】:

我正在开发一个带有数据库的 MVC 应用程序,其中每个表中都有很多空列。现在,如果用户在表单上动态添加字段,我必须检查哪一列完全为空(可用),然后将其分配给用户添加的字段。

为此,我搜索并找到了以下 SQL 代码,它工作正常。

declare @col varchar(255), @cmd varchar(max)
DECLARE getinfo cursor for
SELECT c.name as colum FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID
WHERE t.Name = 'MyTableName'

OPEN getinfo

FETCH NEXT FROM getinfo into @col  
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @cmd = 'IF NOT EXISTS (SELECT * FROM MyTableName WHERE [' + @col + '] IS NOT NULL) BEGIN print ''' + @col + ''' end'
EXEC(@cmd)

FETCH NEXT FROM getinfo into @col
END

CLOSE getinfo
DEALLOCATE getinfo

它打印给定表中所有空行的所有列。现在我想在我的 MVC 控制器中获取该列表。由于它正在打印结果,所以我不能使用 SqlDataReader。所以我在this question的答案中找到了一个方法。它一一给我结果。

public ActionResult getList()
{
    SqlConnection con = DBHelperADO.GetConnection();
    SqlCommand cmd = new SqlCommand(query, con); // query = sql code mentioned above
    con.Open();
    using (con)
    {
        con.InfoMessage += connection_InfoMessage;
        SqlDataReader dr = cmd.ExecuteReader();
    }
}

void connection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    var outputFromStoredProcedure = e.Message;
}
  1. 如何从处理程序中填充所有列名的列表? (不能使用会话或静态列表)

  2. 我不想在 MVC 应用程序中使用事件处理程序,有没有更好的选择? (可能是任何其他 SQL 代码给我所需的结果或通过其他方法获取 PRINT 输出)

【问题讨论】:

    标签: c# sql-server


    【解决方案1】:

    根据@AwaisMahmood 建议更新

    您可以通过临时表更改 print 语句,然后将其返回 (我没有为 set @cmd... 行中的引号检查正确的 sintax,但你可以明白)

    declare @col varchar(255), @cmd varchar(max)
    DECLARE getinfo cursor for
    SELECT c.name as colum FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID
    WHERE t.Name = 'MyTableName'
    
    CREATE TABLE #EmptyFields {
        FieldName nvarchar(60)
    }
    
    OPEN getinfo
    
    FETCH NEXT FROM getinfo into @col  
    WHILE @@FETCH_STATUS = 0
    BEGIN
    SELECT @cmd = 'IF NOT EXISTS (SELECT * FROM MyTableName WHERE [' + @col + '] IS NOT NULL)
    BEGIN
     insert into #EmptyFields (FieldName) values (''' + @col + 
    '')
    ' end'
    EXEC(@cmd)
    
    FETCH NEXT FROM getinfo into @col
    END
    
    CLOSE getinfo
    DEALLOCATE getinfo
    
    select * from #EmptyTables
    

    然后,在客户端,您可以像往常一样使用数据读取器来填写List<string> 或类似的内容。

    【讨论】:

    • 它在插入临时表的行上给出错误。“必须声明表变量“@EmptyFields”。”
    • 更新你的答案。它应该创建一个临时表而不是临时变量。它适用于临时表。
    • 感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多