0

我在 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 作为查询添加到QueryTableAdapter我的 中时ADO DataSet,我在单击Finish按钮之前收到此错误:

max 函数需要 1 个参数

谁能帮我这个?

4

1 回答 1

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 是一个不会导致并发问题的操作。

于 2010-12-14T08:00:24.447 回答