【问题标题】:Prevent selection of column if it does not exist如果不存在,则阻止选择列
【发布时间】:2014-10-24 10:22:18
【问题描述】:

我在 2 个独立的数据库中有 2 个格式相同的表。

数据库1

_________  _____________________   _______________
Code(int)   Description(varchar)    Class(varchar)
_________  _____________________   ________________

数据库2

_________  _____________________   ___________
Code(int)   Description(varchar)    Type(int)
_________  _____________________   ___________

我希望为我的 C# 应用程序编写一个通用查询,该查询从两个数据库中检索值。我写了以下查询

DECLARE @DB = 'Database1'

IF(@DB = 'Database1')
BEGIN

SELECT 
    ID,[Description],Class
FROM MyTable

END

ELSE
BEGIN

SELECT 
    ID,[Description],Type
FROM MyTable

END

但是,当分别为 Database2Database1 运行时,上述查询会为列 ClassType 引发错误。

PS:我正在正确地与数据库建立连接,并相应地设置参数@DB。逻辑是运行此查询两次,一次针对 Database1 并获取相应的 MyTableClass 列,第二次针对 Database2 并获取各自的 MyTableType 列。

我想知道是否有可能实现我想要做的事情。 提前致谢!!

【问题讨论】:

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

用例说明

SELECT 
        ID,[Description],CASE WHEN @DB = 'Database1' THEN Class ELSE Type END
    FROM table 

【讨论】:

  • convert(varchar,CASE WHEN @DB = 'Database1' THEN Class ELSE Type END)
【解决方案2】:

这行不通,因为:

整个请求(批处理)被解析和编译。如果发生错误 在这个阶段,请求以编译错误终止

source

你可以试试动态sql:

IF @DB = 'Database1'
BEGIN
    execute sp_sqlexec 
    'SELECT ID,[Description],[Class]
    FROM MyTable;';
END
ELSE
BEGIN
    execute sp_sqlexec 
    'SELECT ID,[Description],[Type]
    FROM MyTable;';
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 2020-01-01
    • 2017-09-20
    • 2014-02-21
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    相关资源
    最近更新 更多