Sql server 是否仅在ADO和VBScript中的命令对象中指定某些参数?

Sql server 是否仅在ADO和VBScript中的命令对象中指定某些参数?,sql-server,vbscript,ado,Sql Server,Vbscript,Ado,如果我在SQL Server中有一个包含许多命名输入参数的存储过程,则所有参数都具有以下默认值: CREATE PROCEDURE [dbo].[proc_name] ( @IN_mode CHAR(1) = NULL, /* 'I','U'*/ @IN_external_identity_id INT = -1, @IN_provider_name VARCHAR(45) = NULL, @IN_login_id VARCHAR(255) = NULL,

如果我在SQL Server中有一个包含许多命名输入参数的存储过程,则所有参数都具有以下默认值:

CREATE PROCEDURE [dbo].[proc_name] 
(   
    @IN_mode CHAR(1) = NULL, /* 'I','U'*/
    @IN_external_identity_id INT = -1,
    @IN_provider_name VARCHAR(45) = NULL,
    @IN_login_id VARCHAR(255) = NULL,
    @IN_email VARCHAR(255) = NULL,
    @IN_ip VARCHAR(45) = NULL,
    @IN_first_name VARCHAR(255) = NULL,
    @IN_last_name VARCHAR(255) = NULL,
    @IN_json_response_raw VARCHAR(8000) = NULL,
    @IN_user_id VARCHAR(255) = NULL,
    @IN_name VARCHAR(255) = NULL
)
AS 
    BEGIN
...
…在
vbScript
中,我这样调用过程:

Set oSproc = CreateObject("ADODB.Command") 
With oSproc
    .ActiveConnection = oConn
    .CommandText = "bfsp_insert_NEW_EXTERNAL_IDENTITY"
    .CommandType = adCmdStoredProc 
    With .Parameters
        .Append oSproc.CreateParameter("@IN_mode", adChar, adParamInput, 1, "I")
        .Append oSproc.CreateParameter("@IN_external_identity_id", adInteger, adParamInput, 0, -1) '-1 because field isn't needed on new insert
        .Append oSproc.CreateParameter("@IN_provider_name", adVarChar, adParamInput, 45, "FACEBOOK")
        .Append oSproc.CreateParameter("@IN_login_id", adVarChar, adParamInput, 255, getInput("fbNewUserName"))
        .Append oSproc.CreateParameter("@IN_email", adVarChar, adParamInput, 255, oFbUser.email)
        .Append oSproc.CreateParameter("@IN_ip", adVarChar, adParamInput, 46, getUserIp())
        .Append oSproc.CreateParameter("@IN_first_name", adVarChar, adParamInput, 255, oFbUser.first_name)
        .Append oSproc.CreateParameter("@IN_last_name", adVarChar, adParamInput, 255, oFbUser.last_name)
        .Append oSproc.CreateParameter("@IN_json_response_raw", adVarChar, adParamInput, 8000, oFbUser.rawJson)
        .Append oSproc.CreateParameter("@IN_user_id", adVarChar, adParamInput, 255, oFbUser.id)
        .Append oSproc.CreateParameter("@IN_name", adVarChar, adParamInput, 255, oFbUser.name)
    End With 
    .Execute 
End With 
iNewExternalIdentityId = oSproc.parameters("@OUTPUT_originalId").Value 'grabbing the new EXTERNAL_IDENTITY.ID 
Set oSproc = Nothing
我注意到vbscript create parameter语句中的参数名没有按名称链接到存储过程中的变量。它似乎是根据顺序位置匹配的,例如参数1匹配参数1,等等。如果我把其中一个放在中间某个地方,所有剩余的参数将被分配给ScPRC中的错误输入变量。
如何在vbscript代码中创建参数,以便只发送所需的选定参数,并使它们与过程中的参数正确匹配?

我正在发布一个正式答案,其中包含@jeroen mostert的建议

按名称传递参数只需将
namedParameters
属性添加到命令对象,并将其设置为
True
,如下所示。添加了以下代码段中的第3行,否则与原始代码相同:

Set oSproc = CreateObject("ADODB.Command") 
With oSproc
    .NamedParameters = True
    .ActiveConnection = oConn
    .CommandText = "bfsp_insert_NEW_EXTERNAL_IDENTITY"
    .CommandType = adCmdStoredProc 
    With .Parameters
        .Append oSproc.CreateParameter("@IN_mode", adChar, adParamInput, 1, "I")
        .Append oSproc.CreateParameter("@IN_external_identity_id", adInteger, adParamInput, 0, -1) '-1 because field isn't needed on new insert
        .Append oSproc.CreateParameter("@IN_provider_name", adVarChar, adParamInput, 45, "FACEBOOK")
        .Append oSproc.CreateParameter("@IN_login_id", adVarChar, adParamInput, 255, getInput("fbNewUserName"))
        .Append oSproc.CreateParameter("@IN_email", adVarChar, adParamInput, 255, oFbUser.email)
        .Append oSproc.CreateParameter("@IN_ip", adVarChar, adParamInput, 46, getUserIp())
        .Append oSproc.CreateParameter("@IN_first_name", adVarChar, adParamInput, 255, oFbUser.first_name)
        .Append oSproc.CreateParameter("@IN_last_name", adVarChar, adParamInput, 255, oFbUser.last_name)
        .Append oSproc.CreateParameter("@IN_json_response_raw", adVarChar, adParamInput, 8000, oFbUser.rawJson)
        .Append oSproc.CreateParameter("@IN_user_id", adVarChar, adParamInput, 255, oFbUser.id)
        .Append oSproc.CreateParameter("@IN_name", adVarChar, adParamInput, 255, oFbUser.name)
    End With 
    .Execute 
End With 
iNewExternalIdentityId = oSproc.parameters("@OUTPUT_originalId").Value 'grabbing the new EXTERNAL_IDENTITY.ID 
Set oSproc = Nothing

我发布了一个正式的回复,其中包含了@jeroen mostert的建议

按名称传递参数只需将
namedParameters
属性添加到命令对象,并将其设置为
True
,如下所示。添加了以下代码段中的第3行,否则与原始代码相同:

Set oSproc = CreateObject("ADODB.Command") 
With oSproc
    .NamedParameters = True
    .ActiveConnection = oConn
    .CommandText = "bfsp_insert_NEW_EXTERNAL_IDENTITY"
    .CommandType = adCmdStoredProc 
    With .Parameters
        .Append oSproc.CreateParameter("@IN_mode", adChar, adParamInput, 1, "I")
        .Append oSproc.CreateParameter("@IN_external_identity_id", adInteger, adParamInput, 0, -1) '-1 because field isn't needed on new insert
        .Append oSproc.CreateParameter("@IN_provider_name", adVarChar, adParamInput, 45, "FACEBOOK")
        .Append oSproc.CreateParameter("@IN_login_id", adVarChar, adParamInput, 255, getInput("fbNewUserName"))
        .Append oSproc.CreateParameter("@IN_email", adVarChar, adParamInput, 255, oFbUser.email)
        .Append oSproc.CreateParameter("@IN_ip", adVarChar, adParamInput, 46, getUserIp())
        .Append oSproc.CreateParameter("@IN_first_name", adVarChar, adParamInput, 255, oFbUser.first_name)
        .Append oSproc.CreateParameter("@IN_last_name", adVarChar, adParamInput, 255, oFbUser.last_name)
        .Append oSproc.CreateParameter("@IN_json_response_raw", adVarChar, adParamInput, 8000, oFbUser.rawJson)
        .Append oSproc.CreateParameter("@IN_user_id", adVarChar, adParamInput, 255, oFbUser.id)
        .Append oSproc.CreateParameter("@IN_name", adVarChar, adParamInput, 255, oFbUser.name)
    End With 
    .Execute 
End With 
iNewExternalIdentityId = oSproc.parameters("@OUTPUT_originalId").Value 'grabbing the new EXTERNAL_IDENTITY.ID 
Set oSproc = Nothing

请按照(免责声明:未测试)尝试
.NamedParameters=True
。否则,另一种选择是添加没有值(或null)的参数,而不是忽略参数。@jeroen mostert-这很有效。。。我将用您的建议创建一个正式的答案try
。NamedParameters=True
,per(免责声明:未测试)。否则,另一种选择是添加没有值(或null)的参数,而不是省略参数。@jeroen mostert-这很有效。。。我会根据你的建议给出一个正式的答案