【问题标题】:the max function requires 1 argument(s)max 函数需要 1 个参数
【发布时间】:2010-12-14 07:52:32
【问题描述】:

我在 SQL 2008 中编写了这个非常简单的 SP:

Create procedure dbo.GetNextID 
(
    @TableName nvarchar(50),
    @FieldName nvarchar(50)
)
AS
    BEGIN
        exec('select isnull(max('+@FieldName+'),0)+1 as NewGeneratedID from '+ @TableName);
    END

当我在Visual Studio SQL Express 中执行此过程并传递表名和字段名时,它工作正常。但是,当我尝试将此 SP 作为查询添加到我的 ADO DataSet 中的 QueryTableAdapter 中时,我在单击 Finish 按钮之前收到此错误:

max 函数需要 1 个参数

谁能帮我解决这个问题?

【问题讨论】:

    标签: tsql stored-procedures ado.net max tableadapter


    【解决方案1】:

    我猜VS试图通过执行SP来确定一个字段列表。但由于它不知道将什么传递给 SP,所以它使用空参数。现在,当然,您的 select 语句失败了。

    您可以尝试将以下内容添加到您的 SP:

    IF ISNULL(@TableName,'') = '' SET @TableName = '<Name of a test table>';
    IF ISNULL(@FieldName,'') = '' SET @FieldName = '<Name of some field>';
    

    使用此处确实存在的某些字段和表的名称(例如,您也将在应用程序中使用的名称)。

    或者,您可以在exec 上方添加以下内容:

    IF (ISNULL(@TableName, '') = '') OR (ISNULL(@FieldName, '') = '')
    BEGIN
        SELECT -1 AS NewGeneratedId
        RETURN 0
    END
    

    编辑
    附带说明一下,我想就我看到的代码执行的并发问题向您发出警告。如果此代码应该为某个表中的新记录返回唯一 ID,我将重新设计如下:

    创建一个表NumberSeries,其中每行包含一个唯一名称、一个可能的 ID 范围和当前 ID 值。

    创建一个使用UPDATE ... OUTPUT 更新数字系列的当前 ID 并在一步中检索它的存储过程。

    这样您可以确保创建新 ID 是一个不会导致并发问题的单一操作。

    【讨论】:

    • 非常感谢,我使用了你的第一个想法,它成功了!关于使用表来解决并发问题,我不得不说这也是一个好主意,但在我当前的项目中,只有一个用户输入数据......无论如何,真的谢谢......
    猜你喜欢
    • 2012-03-04
    • 2014-09-04
    • 2014-03-26
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2021-12-10
    相关资源
    最近更新 更多