max函数需要1个参数

时间:2010-12-14 07:52:32

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

我在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中执行此过程并传递表名和字段名时,它可以正常工作。但是当我尝试在QueryTableAdapter的{​​{1}}中添加此SP作为查询时,我在点击ADO DataSet按钮之前收到此错误:

the max function requires 1 argument(s)

任何人都可以帮我这个吗?

1 个答案:

答案 0 :(得分: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是一个不会导致并发问题的操作。