C# SqlDataAdapter.FillSchema和条件SQL语句
我正在创建一个应用程序,需要检索SQL语句的模式(实际上是返回表的模式):列名集和相应的SQL类型。 基本实施如下:C# SqlDataAdapter.FillSchema和条件SQL语句,c#,sql,schema,sqldataadapter,C#,Sql,Schema,Sqldataadapter,我正在创建一个应用程序,需要检索SQL语句的模式(实际上是返回表的模式):列名集和相应的SQL类型。 基本实施如下: DataTable table = new DataTable(); SqlDataAdapter sda = new SqlDataAdapter(sqlCommand); sda.FillSchema(table, SchemaType.Source); 之后,我解析DataTable的列信息。 在我尝试在SQL中使用条件语句并基于该条件返回具有不同模式的数据之前,一切都正
DataTable table = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter(sqlCommand);
sda.FillSchema(table, SchemaType.Source);
之后,我解析DataTable的列信息。
在我尝试在SQL中使用条件语句并基于该条件返回具有不同模式的数据之前,一切都正常。例如:
CREATE TABLE TestDataTable(Column1 int, Column2 nvarchar(100))
IF EXISTS(SELECT * FROM TestDataTable)
BEGIN
SELECT Column1 FROM TestDataTable WHERE Column1>2
END
ELSE
BEGIN
SELECT Column2 FROM TestDataTable WHERE Column1>2
END
结果总是检索到的模式中的Column1,这不取决于IF语句中的条件(当我反转它时,结果仍然相同)。
SELECT子句中还有一个SQL指示符是CASE语句——如果它们根据某些条件返回不同的列,我们会得到更令人惊讶的结果
我尝试了不同的变体和选项,但它们都有自己的局限性:
DECLARE @selectPart1 nvarchar(100)
SET @selectPart1=N'SELECT Column1'
DECLARE @selectPart2 nvarchar(100)
SET @selectPart2=N'FROM TestDataTable'
DECLARE @selectQuery nvarchar(200)
SET @selectQuery = @selectPart1 + ' ' + @selectPart2
EXECUTE sp_executesql @selectQuery"
但是如果它成功地计算了SET语句,为什么它不能计算IF条件呢?
PS:我知道,基于某些条件返回不同数据模式的语句是不寻常的,很难处理,这肯定是一种不好的做法,但我们将得到的SQL是用户提供的,我们至少应该检测到这种不一致的情况
作为一种解决方法,检测此类情况的方法(向用户显示适当的消息)也是可以接受的。