替代 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 输出的主要内容,如果未能解决你的问题,请参考以下文章