3

我想要在 SQL Server 中创建的调用函数,它接收两个参数并返回一个整数。当我调用存储过程时,我使用以下代码:

    sqlcmd.CommandType = CommandType.StoredProcedure
    sqlcmd.CommandText = "PROCEDURE_NAME"

    sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param1", Utilities.NothingToDBNull(user)))
    sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param2", Utilities.NothingToDBNull(password)))
    da = New SqlClient.SqlDataAdapter()
    da.SelectCommand = sqlcmd
    table = New DataTable()
    da.Fill(table)

在这种情况下,我有一个存储过程返回的表。如果我想使用返回标量值的函数而不是存储过程,会发生什么变化?

4

3 回答 3

5

您不能直接调用该函数,只有StoredProcedure, Text( query ),并且TableDirect是允许的。既然您已经接触过存储过程,为什么不创建一个具有该功能的过程呢?

在您的 C# 代码中,您可以使用ExecuteScalar命令对象的

sqlcmd.CommandType = CommandType.StoredProcedure
sqlcmd.CommandText = "PROCEDURE_NAME"
sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param1", Utilities.NothingToDBNull(user)))
sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param2", Utilities.NothingToDBNull(password)))

Dim obj as Object = sqlcmd.ExecuteScalar() 
' obj hold now the value from the stored procedure.

你的存储过程现在应该是这样的,

CREATE PROCEDURE PROCEDURE_NAME
    @param1 VARCHAR(15),
    @param2 VARCHAR(15)
AS
BEGIN
    SELECT function_name(@param1, @param2)
    FROM...
    WHERE....
END
于 2012-09-11T07:44:08.167 回答
2

如果要返回单个值,可以使用 SELECT 查询调用该函数

sql服务器代码

CREATE FUNCTION Test
(
  @p1 varchar(10),
  @p2 varchar(10)
)
RETURNS varchar(20)
AS
BEGIN
  RETURN @p1 + @p2
END

vb.net代码

Using cnn As New SqlClient.SqlConnection("Your Connection String")
  Using cmd As New SqlClient.SqlCommand("SELECT dbo.Test(@p1,@p2)", cnn)
    cmd.Parameters.AddWithValue("@p1", "1")
    cmd.Parameters.AddWithValue("@p2", "2")

    Try
      cnn.Open()
      Console.WriteLine(cmd.ExecuteScalar.ToString)  //returns 12
    Catch ex As Exception
      Console.WriteLine(ex.Message)
    End Try
  End Using
End Using
于 2012-09-11T15:34:08.503 回答
1

如果要将存储过程中的值作为单行、单列结果集返回,请使用该SqlCommand.ExecuteScalar方法。

我的首选方法是实际使用已用 TSQLRETURN语句相应编写的存储过程的返回值,然后调用SqlCommand.ExecuteNonQuery.

MSDN 上都提供了示例,但针对您的具体情况,

Dim returnValue As SomeValidType

Using connection = New SqlConnection(connectionString))
    SqlCommand command = New SqlCommand() With _
        {
            CommandType = CommandType.StoredProcedure, _
            CommandText = "PROCEDURE_NAME" _
        }

    command.Parameters.Add(New SqlParameter() With _
        {
            Name = "@RC", _
            DBType = SomeSQLType, _
            Direction = ParameterDirection.ReturnValue  _ // The important bit
        }
    command.AddWithValue("@param1", Utilities.NothingToDBNull(user))
    command.AddWithValue("@param2", Utilities.NothingToDBNull(password))

    command.Connection.Open()
    command.ExecuteNonQuery()

    returnValue = CType(command.Parameters["@RC"].Value, SomeValidType)
End Using

顺便说一句,您会注意到在 .Net 4.5 中有这些函数的方便异步版本,但我担心这超出了问题的范围。

于 2012-09-11T15:46:33.007 回答