替代 SQL 的 PRINT 输出

Posted

技术标签:

【中文标题】替代 SQL 的 PRINT 输出【英文标题】:Alternative of PRINT output from SQL 【发布时间】: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;

    如何从处理程序中填充所有列名的列表? (不能使用会话或静态列表)

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

【问题讨论】:

【参考方案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”。” 更新你的答案。它应该创建一个临时表而不是临时变量。它适用于临时表。 感谢您的回答

以上是关于替代 SQL 的 PRINT 输出的主要内容,如果未能解决你的问题,请参考以下文章

在视图中使用变量的替代方法

Spark SQL - “包含”功能的替代方案

python if-else替代三元表达式

“perl -e”命令的替代品[关闭]

PHP 替代Print_r()

PHP print_r的替代方法,带有语法高亮显示