在不使用模式的情况下测试 SQL 服务器列是否存在?
Test if a SQL Server column exists without using the schema?
我们在 ADO.Net 中读到的第 3 方数据库最近在其新版本代码中添加了一列。这是新 table.
的 fkey
我们有 read-only 访问数据 table 的权限,因此 理论上 不能依赖架构来执行此操作。所以...
1) INFORMATION_SCHEMA 始终 可用于您可以访问的项目,或者我们是否有可能甚至没有 table 我们可以访问的权利读了吗?
2) 如果 (1) 是 "bad",规范解是什么?在 SQL 本身,我会做一个 SELECT * FROM x WHERE 1=0
,然后测试 headers,在 .Net 中是否有等效的测试?
您可以通过 XML.
列出来自任何 Table 或查询的列名(值是可选的)
例子
Declare @AnyTableOrQuery Table (EmpID int,EmpName varchar(50),Salary int,Location varchar(100))
Insert Into @AnyTableOrQuery Values
(1,'Arul',100,null)
,(2,'Jane',120,'New York')
Select B.*
From ( values (cast((Select Top 1 * From @AnyTableOrQuery for XML RAW,ELEMENTS XSINIL) as xml))) A(XMLData)
Cross Apply (
Select Column_Name = a.value('local-name(.)','varchar(100)')
,Column_Value = a.value('.','varchar(max)')
From A.XMLData.nodes('/row') as C1(n)
Cross Apply C1.n.nodes('./*') as C2(a)
) B
Returns
Column_Name Column_Value
EmpID 1
EmpName Arul
Salary 100
Location
EDIT
@MauryMarkowitz 提供了一个更好的解决方案(见下面的评论)
sp_describe_first_result_set @tsql = N'Select * from YourTable'
我们在 ADO.Net 中读到的第 3 方数据库最近在其新版本代码中添加了一列。这是新 table.
的 fkey我们有 read-only 访问数据 table 的权限,因此 理论上 不能依赖架构来执行此操作。所以...
1) INFORMATION_SCHEMA 始终 可用于您可以访问的项目,或者我们是否有可能甚至没有 table 我们可以访问的权利读了吗?
2) 如果 (1) 是 "bad",规范解是什么?在 SQL 本身,我会做一个 SELECT * FROM x WHERE 1=0
,然后测试 headers,在 .Net 中是否有等效的测试?
您可以通过 XML.
列出来自任何 Table 或查询的列名(值是可选的)例子
Declare @AnyTableOrQuery Table (EmpID int,EmpName varchar(50),Salary int,Location varchar(100))
Insert Into @AnyTableOrQuery Values
(1,'Arul',100,null)
,(2,'Jane',120,'New York')
Select B.*
From ( values (cast((Select Top 1 * From @AnyTableOrQuery for XML RAW,ELEMENTS XSINIL) as xml))) A(XMLData)
Cross Apply (
Select Column_Name = a.value('local-name(.)','varchar(100)')
,Column_Value = a.value('.','varchar(max)')
From A.XMLData.nodes('/row') as C1(n)
Cross Apply C1.n.nodes('./*') as C2(a)
) B
Returns
Column_Name Column_Value
EmpID 1
EmpName Arul
Salary 100
Location
EDIT
@MauryMarkowitz 提供了一个更好的解决方案(见下面的评论)
sp_describe_first_result_set @tsql = N'Select * from YourTable'