функция max требует 1 аргумента (ов) - PullRequest
0 голосов
/ 14 декабря 2010

Я написал этот очень простой SP в SQL 2008:

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:

the max function requires 1 argument(s)

Может кто-нибудь помочь мне с этим?

1 Ответ

1 голос
/ 14 декабря 2010

Я предполагаю, что VS пытается определить список полей, выполняя SP.Но так как он не знает, что передать SP, он использует пустые параметры.Теперь, конечно, ваш оператор выбора завершается неудачей.

Вы можете попробовать добавить следующее к своему 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

РЕДАКТИРОВАТЬ
Кроме того, я хотел бы предупредить вас о проблемах параллелизма, которые я вижу, исходя из того, что делает ваш код.Если этот код должен возвращать уникальный идентификатор для новой записи в некоторой таблице, я бы изменил это следующим образом:

Создайте таблицу NumberSeries, где каждая строка содержит уникальное имя, возможный диапазон дляИдентификаторы и текущее значение идентификатора.

Создайте хранимую процедуру, которая использует UPDATE ... OUTPUT, чтобы обновить текущий идентификатор для серии чисел и извлечь его за один шаг.

Таким образом, вы можете быть уверены, чточто создание нового идентификатора - это отдельная операция, которая не вызывает проблем с параллелизмом.

...