Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MS SQL允许您创建非法列?_Sql_Sql Server - Fatal编程技术网

为什么MS SQL允许您创建非法列?

为什么MS SQL允许您创建非法列?,sql,sql-server,Sql,Sql Server,我最近看到一条tweet,说您可以通过以下方式构建表,防止其他开发人员使用SELECT*from TableName读取表: CREATE TABLE [TableName] ( [ID] INT IDENTITY NOT NULL, [Name] VARCHAR(50) NOT NULL, [DontUseStar] AS (1 / 0) ); 很容易看出,使用SELECT*在这里尝试将空白列名称读取为1除以0,从而导致除零错误,但没有分配给该列的数据类型。 为什么SQL允

我最近看到一条tweet,说您可以通过以下方式构建表,防止其他开发人员使用SELECT*from TableName读取表:

CREATE TABLE [TableName]
(
   [ID] INT IDENTITY NOT NULL,
   [Name] VARCHAR(50) NOT NULL,
   [DontUseStar] AS (1 / 0)
);

很容易看出,使用SELECT*在这里尝试将空白列名称读取为1除以0,从而导致除零错误,但没有分配给该列的数据类型。


为什么SQL允许您创建一个没有指定数据类型的列,并且其名称是非法的?

您创建的是一个计算列,它非常强大和有用

表达式可以是任何内容。例如,您可以定义:

CREATE TABLE [TableName] (
   [ID] INT IDENTITY NOT NULL,
   [Name] VARCHAR(50) NOT NULL,
   NameLength as (LEN(Name))
);
这将创建一个名为NameLength的列,当您引用它时,它将始终具有名称的长度-没有更新、没有触发器、没有视图。它只是工作

您不需要类型,因为SQL Server可以解决这个问题


您所犯的错误甚至可能是有益的——如果您真的想强制用户从不使用select*

它是计算列的一种完全有效的语法。计算列可用于计算select上的某些值,而无需实际存储它们,尽管该值可以持久化

之所以允许1/0,是因为实际计算的列值直到运行时才会计算。例如,可以将计算列定义为columna/columnb,如果columnb中的任何行具有0和is,则会发生相同的错误,但仅当选择了该行/列时才会发生

if object_id('tempdb..#t') IS NOT NULL
    drop table #t;

CREATE TABLE #t 
(a int
,b int
,div as (a/b)
);

INSERT INTO #t
values 
(1,1)
,(2,0);

SELECT * FROM #t WHERE a = 1;
SELECT a from #t; -- NO ERRORS

SELECT * FROM #t WHERE a=2; --WILL RESULT IN AN ERROR
SELECT * FROM #t; --WILL RESULT IN AN ERROR

我认为创建一个不允许从中选择行的表是一种很好的方法。为什么需要这样一张桌子?谁知道呢,可能是给它装上电线而不是触发器之类的。任何编程语言都允许像x=1/0这样的代码,决定需要它的原因不是编译器的事。

这个计算列有一个数据类型,它是整数,因为基础表达式整数除以整数就是整数。这个名称不是非法的;值为。该列没有任何非法内容。如下所述,它是一个完全可以接受的计算列,在运行时(即计算发生时)总是抛出一个错误。然而,正如@EricBrandt所解释的,运行时是这里的关键。?你能elaborate@scsimon正确,不能选择任何行,但它们可以,只要您明确列出列。。。不包括课程的计算列,我不标记它,但这实际上是一个注释,而不是答案。