【问题标题】:MAX is not a recognized table hints optionMAX 不是公认的表提示选项
【发布时间】:2015-11-05 17:24:10
【问题描述】:

问题:

使用SQL 2012中的存储过程创建表。我过去使用“MAX”来获取最大值,但这次得到以下错误:

“MAX”不是公认的表格提示选项。如果它打算作为表值函数或 CHANGETABLE 函数的参数,请确保您的数据库兼容模式设置为 90。

我尝试过不使用 Max 并且例程运行,但当然会给出错误的值,我也尝试过 As FieldNameX,但这没有帮助。

目标:

获取辅助表中链接列的最大值。即 Table1 的 ID 为 xyz,Table2 有 xyz、“1”、“2”和“3”三个列表,因此应该将“3”作为放入新表的值。

代码:

USE [Database]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[spPropertyListBCP]
(
    @tableName NVARCHAR(256)     
)
AS
BEGIN 
DECLARE @sql NVARCHAR(MAX)


SET @sql = 'SELECT p.ID AS UniqueID
INTO ' + @tableName  + ' FROM TblProperty AS p
(
MAX(T2.ValueField),
p.BuildingNo,
p.Street 
)
JOIN
TblTable2 as T2 on p.ID= T2.ID'
EXEC (@sql)
END

研究:

在其他人中 ~ SQL Server 2005 Error - ""MAX" is not a recognized table hints option" 似乎很重要,但我不相信这正是我所追求的

【问题讨论】:

  • FROM table AS p (MAX().....) 不是有效的语法。你想做什么?
  • 我做了小代码修改。 Table1 (TblProperty) 有一个唯一的 ID 列表。 Table2 有一个包含这些 ID 的列表,但该 ID 会出现多次。我想用ID搜索Table2,得到第二个表中x列的最大值
  • 那些应该是动态生成表的附加列吗?作为旁注,我建议对您的程序进行一些更改。您应该将 @tableName 的数据类型更改为 sysname 而不是 nvarchar(无需在表名中使用扩展字符)。其次,我建议将您的变量包装在动态 sql 中的 QUOTENAME 中,以防止 sql 注入。
  • 而不是执行动态 SQL,PRINT @sql 这样您就可以在执行之前查看正在构建的内容。也许你会更容易发现错误。
  • @Lamak 我知道这是它的同义词。在这篇文章中,您最终可能会得到一个比适合的值更长的值,因为该参数是长度的两倍。

标签: sql-server stored-procedures


【解决方案1】:

这是基于对要求的非常模糊的解释而在黑暗中拍摄的。

ALTER PROCEDURE [dbo].[spPropertyListBCP]
(
    @tableName sysname
)
AS
BEGIN 
    DECLARE @sql NVARCHAR(MAX)

    set @sql = 'SELECT p.UPRN AS UPRN
        , MAX(T2.ValueField) As ValueFieldName
        , p.BuildingNo
        , p.Street 
    INTO ' + QUOTENAME(@tableName)  + ' 
    FROM TblProperty AS p
    JOIN TblTable2 as T2 on p.ID = T2.ID
    GROUP BY p.UPRN
        , p.BuildingNo
        , p.Street';

    exec sp_executesql @sql
END

【讨论】:

  • 在执行 SELECT...INTO 时,您需要确保所有列都已命名。该 MAX 函数需要某种别名。
  • 嗨,我几乎同时解决了这个问题,这真的是我没有“看到”的 Group。
  • @MartinSoles 同意了。这当然是基于极其松散定义的未经测试的代码。
猜你喜欢
  • 2012-11-05
  • 1970-01-01
  • 2018-04-09
  • 2019-04-25
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 2020-06-19
相关资源
最近更新 更多