如何将列名转换为SQL Server中的结果值?

问题描述:

我有一个基本上在传统数据库中布尔值的表。列名称作为字符串值存储在另一个表中,所以我需要将一个表的列名与另一个表中的字符串值进行匹配。我知道必须有一种方法可以直接在SQL Server中使用SQL,但它不在我身边。如何将列名转换为SQL Server中的结果值?

我最初的想法是使用PIVOT,但默认情况下它并未启用,并且将该更改推送到生产数据库时启用它可能会是一个困难的过程。我宁愿使用默认启用的内容。

我正在考虑使用COALESCE将布尔值转换为我需要的值的字符串。这将是一个手动过程。

我想我还会使用一个表变量来将第一个查询的结果插入到该变量中,并使用这些结果来执行第二个查询。我仍然有问题,列是在一个单一的行上,所以我希望我可以轻松地转换值以将字段名作为字符串放在结果集中。但是,如果我可以轻松地做到这一点,我可以轻松地使用子选择来编写查询。

欢迎任何提示。

+0

PIVOT和UPIVOT由“默认”启用。如果您以向后兼容模式运行,它们不会启用,但这不是“默认”。如果在2010年发现自己编写变通方法是因为您将数据库保持在SQL 2000兼容模式下,那么您应该自问自问为什么在我的情况下仍然使用SQL 2000兼容模式... – 2010-03-22 21:04:24

+0

我在兼容性级别检查了SQL Server 2000 。在没有单元测试的情况下更改它非常危险。 “exec sp_dbcmptlevel LegacyDatabase” – Brennan 2010-03-22 21:10:48

+0

我并不是说不用UT来改变它。我在说,如果你正在开发*新的代码来解决后台兼容问题,或许是时候重新审视兼容级别并投入一些努力来使其更新,所以你不必花费精力去做工作。 – 2010-03-22 23:37:41

签出SQL Server中的Sysobjects和SysColumns。它们是2个SQL表,它们为您提供数据库中表的名称以及与该表一起使用的列的名称。

系统视图INFORMATION_SCHEMA.COLUMNS也会给你你想要的。

如果您对.Net感到满意,您可以使用自己选择的语言编写自己的存储过程,然后使用代码操作数据。

继承人的链接上手 CLR Stored Procedures

我不太知道我理解你的设计目前是如何放在一起(你可以张贴的例子吗?),但INFORMATION_SCHEMA.COLUMNS查看会给你一个包含所有列名称作为字符串值的表。如果你加入你的第二张桌子,我想你可能会得到你需要的东西。

您可以构建一个SQL字符串,然后将该字符串作为查询执行。不是最漂亮的,但我认为它会按照你想要的方式工作。您只需使用游标或while循环来构建字符串。

比如我有有3列STATEtbl一个表,我想这个表的所有列名作为行值...我使用下面的查询

Select SC.name as Columns from Syscolumns SC 
Join Sysobjects SO On SC.id = SO.Id 
where Object_name(SO.Id) = 'STATEtbl' 

结果查询:

Columns 
-------- 
State 
StateCode 
StateFullName