我在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)
任何人都可以帮我这个吗?
答案 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是一个不会导致并发问题的操作。