SQL Server:在CASE中创建视图

时间:2015-11-09 13:40:57

标签: sql sql-server case-statement create-view

我正在尝试在case语句中创建视图,但SQL Server不允许它。这是一个例子:

SELECT value,
CASE value
  WHEN 'value1' THEN (Create View as (Select ... From ... Where...))
  WHEN 'value1' THEN (Create View as (Select ... From ... Where...))
END
FROM table
WHERE table.parameter = 'some_parameter'

有人知道它为什么不起作用吗?提前谢谢。

2 个答案:

答案 0 :(得分:2)

您在这里混合使用DDL和DML。

CREATE VIEW是DDL(数据定义语言),关心数据结构(表,视图,过程,触发器......)

另一方面,SELECT语句是DML(数据管理语言),关心数据。您可以选择,更新,插入或删除数据。有些人甚至认为SELECT甚至不是DML的一部分,因为它不会改变数据。

您不能使用SELECT来调用DDL。 SELECT应该从表中获取一些数据,而不是创建视图或表。

无论如何,你真正想要实现什么?您为什么要根据纯数据更改数据结构?应该修复数据结构,只应添加,更改或删除数据本身。

(是的,您可能不时需要调整数据结构,例如添加索引,因为您发现应用中的数据访问速度太慢,甚至更改表并添加新列。您可能想要在某个时间添加视图,因为您正在寻找一种更方便的方法来在新应用中选择数据,但所有这些都很少见。)

我现在唯一可以想到的情况是,如果你有一个可以导致DDL的表,那就是:你是一名DBA并且开发了一个开发人员输入他们的DDL请求的应用程序。然后,您有一个应用程序在授权条目上运行并执行适当的DDL。您可以在DBMS之外(C#中的应用程序,Java或从数据库中选择数据,构建DDL语句并执行它们)或在构建动态DDL语句的存储过程中的DBMS内部执行此操作。

答案 1 :(得分:0)

在t-sql中,这是MS SQL Server的SQL风格,case语句用于根据特定条件返回一个值。

如果要在t-sql中引入分支逻辑,可以使用ifelse

以下是一个示例,基于您的示例:

declare @Value varchar(128);
select top 1 @Value = value from table where table.parameter = 'some_parameter';

if @Value = 'value1'
begin
    Create View as (Select ... From ... Where...);
end
else if @Value = 'value2'
begin
    Create View as (Select ... From ... Where...);
end

注意:beginend块是可选的,如果您只有一个语句。