【问题标题】:What is the Max number of Columns allowed in SQL Server 2008 View?SQL Server 2008 视图中允许的最大列数是多少?
【发布时间】:2014-04-02 00:23:36
【问题描述】:

这是一个我似乎无法快速找到明确答案的奇怪问题。

在 SQL Server 2008 中,视图中允许的列数是否有最大限制?从 MSDN 文章(下)我看到每个 Select 语句有 4096 列的限制。然后将其应用于视图吗?

例子:

CREATE VIEW [dbo].[TestView]
AS
SELECT     Column1, Column2 FROM dbo.SomeTableName

在此视图中我是否会被限制为 4096 列?

http://msdn.microsoft.com/en-us/library/ms143432.aspx

【问题讨论】:

  • 如果您接近极限,您的数据库很可能存在一些结构缺陷。
  • 某种意义上同意,但是,你不知道上下文。我们为最终用户提供了一个界面,以简化方式来创建他们自己的某些表和列的视图。理论上,最终用户可能会创建一些无法管理的视图。我想确保我们让他们有能力做他们需要做的事情,同时将问题降到最低。

标签: sql-server-2008


【解决方案1】:

默认情况下寻找权威来源,我想我会尝试...

似乎限制为 1024 列,在 SQLServer 9.0(“Express”和 Enterprise 版本)中就是这种情况。

错误信息是: 消息 4505,级别 16,状态 1,过程 wvTest,第 3 行 CREATE VIEW 失败,因为视图 ​​'vwTest' 中的列 'Yo1' 超过 1024 列的最大值。

【讨论】:

  • @bogertron 谢谢那是几个小时的繁琐编辑!...(幸运的是我编写了制作这样一个怪物的脚本;-))
  • mjv, v9 是 2005。你可以访问 SQL 2008 做同样的测试吗?
  • 最佳实践怎么样?我可以使用所有 1024 列吗?或者如果我超过 100 列(例如),我应该创建新表吗?
【解决方案2】:

这里是 Microsoft 链接以获得完整的详细信息....

http://msdn.microsoft.com/en-us/library/ms143432.aspx

据此微软...

Columns per nonwide table  | 1,024 
Columns per wide table     | 30,000

【讨论】:

    【解决方案3】:

    您不能为一个视图创建超过 1024 列。

    http://msdn.microsoft.com/en-us/library/ms143432.aspx

    如何测试它:

    运行这两个过程以创建具有 n 个列的表

    存储过程 1:

    CREATE Proc [dbo].[CreateTableWithNColumnsPrefixX]
    (@TableName nvarchar(100),@NumofCols int)
    AS
    BEGIN
    DECLARE @i INT
    DECLARE @MAX INT
    DECLARE @SQL VARCHAR(MAX)
    DECLARE @j VARCHAR(10)
    DECLARE @len int
    SELECT @i=1
    SELECT @MAX=@NumofCols
    SET @SQL='CREATE TABLE ' + @TableName + '('
    WHILE @i<=@MAX
    BEGIN
    select @j= cast(@i as varchar)
    SELECT @SQL= @SQL+'X'+@j  +' NVARCHAR(500) , '
    SET @i = @i + 1
    END
    select @len=len(@SQL)
    select  @SQL = substring(@SQL,0,@len-1)
    SELECT @SQL= @SQL+ ' )'
    exec (@SQL)
    END
    GO
    

    存储过程 2:

    CREATE Proc [dbo].[ CreateTableWithNColumnsPrefixA]
    (@TableName nvarchar(100),@NumofCols int)
    AS
    BEGIN
    
    DECLARE @i INT
    DECLARE @MAX INT
    DECLARE @SQL VARCHAR(MAX)
    DECLARE @j VARCHAR(10)
    DECLARE @len int
    SELECT @i=1
    SELECT @MAX=@NumofCols
    SET @SQL='CREATE TABLE ' + @TableName + '('
    
    WHILE @i<=@MAX
    
    BEGIN
    select @j= cast(@i as varchar)
    SELECT @SQL= @SQL+'A'+@j  +' NVARCHAR(500) , '
    SET @i = @i + 1
    END
    select @len=len(@SQL)
    
    select  @SQL = substring(@SQL,0,@len-1)
    
    
    SELECT @SQL= @SQL+ ' )'
    
    exec (@SQL)
    
    END
    
    GO
    

    使用 1st SP 创建包含 1024 列的表 t1。

    使用 2nd SP 创建具有 1024 列的表 t2。

    现在运行以下查询:

    Create view TestView
    As
    Select * from t1,t2
    

    会报如下错误

    Msg 4505, Level 16, State 1, Procedure TestView, Line 3
    CREATE VIEW failed because column 'A1' in view 'TestView' exceeds the maximum of 1024 columns.
    

    【讨论】:

      【解决方案4】:

      即使在我的 SQL Server 2008 R2(版本 10.5)中,VIEW 列也有 1024 列的限制。抱歉,我希望不是这样。

      我的客户使用数据透视表和数据透视图在 Excel 中使用数据。 Excel 在这方面做得很好,如果您向它提供一个数据仓库视图,其中包含所有内容的行和所有内容的列,包括厨房水槽。但是 SQL Server 不能存储超过 1024 列的视图,这真的很痛苦。

      现在我必须教我的客户在 Excel 中手动编辑数据连接属性后面的 SQL 语句。什么样的恶梦!他们中很少有人得到它。我们的程序员很聪明,用户很笨,这就是为什么我们应该(任何听微软的人???)不要在我们的软件中建立任意限制。永远。

      【讨论】:

      • 我完全同意,但我敢打赌,他们建立的不是任意限制,而是更多的限制来自内存和计算机受到更多限制的日子,他们只是从来没有把限制拿出来。这只是我的猜测。 :)
      猜你喜欢
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      相关资源
      最近更新 更多