nodejs mssql — передано слишком много параметров Хранимая процедура

Я столкнулся с «Передано слишком много параметров» в хранимую процедуру при попытке запустить хранимую процедуру в NodeJs с помощью mssql.

Код:

//This computerName is what we'll find in our mssql server to see
//if the server entry exist or not and the stored procedure will take this as a parameter.
var computerName = "some.fake.server.com";
var secProfile = "";

//Logic
// If computerName passed is valid and not null.
//if (computerName != "") {
var sql = require('mssql');

var config = {
    user: 'dbuser',
    password: 'secure9ass',
    server: 'dbserver.domain.com',
    database: 'DBName',
    pool: {
        max: 10,
        min: 0,
        idleTimeoutMillis: 30000
    }
}

sql.connect(config).then(function(output) {
  // Stored Procedure
    new sql.Request()
    .input("ComputerName", sql.VarChar(100), computerName)
  .output('sqlOutput', sql.VarChar(1000), "Stored procedure has not run yet!!")
    .execute('dbo.getSysStatus_ByName').then(function(recordsets) {
    console.dir(recordsets);
  }).catch(function(err) {
        // ... error checks
    console.log('ERROR1::: ' + err)
    console.log("----")
    console.log(err)
    console.log("====")
    console.log(recordsets)
    console.log("----")
    console.log('ERROR2::: '+ sqlOutput);
    console.log('ERROR3::: '+ request.parameters.sqlOutput.value);
});
  console.log(output);
}).catch(function(err) {
  // ... error checks
  console.log('ERROR5::: '+ err);
});

Ошибка: в имя процедуры передано слишком много параметров: getSysStatus_ByName

Я проверил в базе данных, что хранимая процедура имеет только один ожидаемый параметр, и этот параметр: ComputerName

Я знаю, что мне не хватает только имени параметра, но я пробовал

.input("@ComputerName", sql.VarChar(100), computerName)

or

.input("computerName", sql.VarChar(100), computerName)

or

.input("computername", sql.VarChar(100), computerName)

Ничего не помогло и выдает ту же ошибку. Кроме того, попытался изменить тип параметра с sql.VarChar(xxx) на sql.Int (в этом случае он выдает ошибку, говоря о недопустимом типе, поэтому я знаю, что sql.VarChar(xxx) это хорошо.

Один из скриптов .vb (visual basic), который успешно работает, имеет следующие строки кода, и он работает. Мне интересно, почему мой код в nodejs дает мне ошибку.

                      Set objCmd = CreateObject("ADODB.Command")

                      ObjCmd.ActiveConnection = Conn

                      ObjCmd.CommandTimeout  = 180 'in seconds

                      ObjCmd.CommandType = 4          'Stored Procedure

                      ObjCmd.CommandText = "dbo.getSysStatus_ByName"

                      objCmd.Parameters.Append objCmd.CreateParameter("@ComputerName", 200, 1, 1024, ComputerName)

В соответствии с CreateParameter (справка ADO страница) говорится, что 200 – это # ​​для

adVarChar 200 A string value (Parameter object only). 

1 means: direction variable (where 1 is for an Input Parameter in my case) and
1024 is the size of the input variable.

У меня нет VPN-подключения, чтобы попробовать, но я надеюсь, что ошибка не возникает из-за размера 1024 против 1000 (в моем примере кода для строки .input(..)). Завтра протестирую.


person AKS    schedule 17.06.2016    source источник
comment
что, если вы удалите часть .output !!!! и запустить выполнение после предоставления входных параметров   -  person Malcolm    schedule 17.06.2016
comment
@Malcolm Я не думаю, что это изменит поведение, но я попробую и дам вам знать.   -  person AKS    schedule 17.06.2016
comment
@Malcolm Хорошо, комментирование строки .output(...) устраняет проблему. Я проверил, что хранимая процедура (если запустить ее вручную с помощью SQL Manager) работает успешно и возвращает 0 (целое число). Но мне интересно, ПОЧЕМУ я не могу дать: .output('sqlOutput', sql.Int) или что-то вроде .output('return_value', sql.Int).... как только я раскомментирую эту строку, Я вижу слишком много параметров. Интересно, нужно ли мне вообще определять строку .output(...), поскольку я думаю, что могу сделать и так: .execute('dbo.getSysStatus_ByName').then(function(err,recordsets, returnValue) { .... }   -  person AKS    schedule 17.06.2016
comment
Если вы укажете ключевое слово OUTPUT для параметра в определении процедуры, вам не нужно комментировать выходную часть, она будет работать. если ваше выполнение процедуры возвращает результат, вы попадете в наборы записей... функцию, которую вы уже реализовали.   -  person Malcolm    schedule 20.06.2016
comment
@Malcolm - Можете ли вы опубликовать свои ответы в качестве ответа, я отмечу это как действительный ответ. Спасибо.   -  person AKS    schedule 21.06.2016


Ответы (1)


Если вы укажете ключевое слово OUTPUT для параметра в определении процедуры, то только вы получите привилегию использовать следующую строку; когда вы определяете sql.Request()

.output('sqlOutput', sql.VarChar(1000), "Stored procedure has not run yet!!")

Использование типа OUTPUT в хранимой процедуре только для примера, рассматривающего ваш случай:

CREATE PROCEDURE dbo.getSysStatus_ByName    
    @ComputerName varchar(100),  
    @sqlOutput VarChar(1000) OUTPUT  
AS 
BEGIN 
    //YOUR SP CODE HERE 
END

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

   .execute('dbo.getSysStatus_ByName').then(function(recordsets) {
    //recordsets is an result return by your executed stored procedure  })

SQL Server с NODE.JS — Начало работы

Как и в вашем случае, ваша сохраненная процедура не содержит какого-либо типа Output, поэтому вы можете просто удалить/закомментировать строку ниже:

.output('sqlOutput', sql.VarChar(1000), "Хранимая процедура еще не запущена!!")

person Malcolm    schedule 21.06.2016
comment
один быстрый вопрос, используя криптографию или что-то подобное, как я могу сделать приведенный выше код в своем посте безопасным, т. е. я не жестко кодирую конфигурацию. в нем пароль? Любая помощь! - person AKS; 30.06.2016