【发布时间】: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