-1

我正在尝试在 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'

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

4

2 回答 2

2

您在这里混合 DDL 和 DML。

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

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

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

无论如何,你真正想要实现什么?为什么你会想要仅仅基于数据来改变你的数据结构?数据结构应该是固定的,只有数据本身应该被添加、更改或删除。

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

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

于 2015-11-09T15:29:36.070 回答
0

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

如果你想在 t-sql 中引入分支逻辑,你可以使用ifand来实现else

这是一个示例,基于您的示例:

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

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

于 2015-11-09T14:25:53.853 回答