如何在C#中从Sql Server 2005读取存储过程查询?

时间:2012-08-30 09:10:30

标签: c# sql sql-server-2005

我有一个简单的存储过程

CREATE PROCEDURE [dbo].[simple]

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @sql NVARCHAR(MAX)

    SELECT @sql = '
            SELECT TOP(5) * FROM aTable'
        PRINT @sql

    EXEC sp_executesql 
        @sql
END

现在,在C#中,如果可能的话,我希望从存储过程中获取@sql值(在执行之后)。

我使用的是Sql Server 2005。

如何在 C#中执行此操作?

4 个答案:

答案 0 :(得分:3)

您需要从SPROC明确返回。

此处至少有 3 2个选项

  1. OUT参数(CREATE PROCEDURE [dbo].[simple] @sql NVARCHAR(MAX) OUT
  2. RETURN值(RETURN @sql
  3. SELECT @sql作为SPROC的最后一行
  4. 然后,您需要在C#代码中使用适当的技术将其绑定

    编辑返回无效 - Integer expressions only

    Re:我如何在C#中执行此操作?

    假设您使用的是ADO.NET SqlClient:

    如果您使用OUTPUT

    var myParam = new SqlParameter("@sql", SqlDbType.VarChar);
    myParam.Direction = ParameterDirection.Output;
    myCmd.Parameters.Add(myParam);
    

    如果您使用SELECT,它将作为SPROC的附加结果集。 由于你的proc已经发出了一个结果集('sp_executesql @sql'),这将是第二个。

答案 1 :(得分:3)

在评论中,您希望在调用该方法后从C#代码访问@sql。所以:

CREATE PROCEDURE [dbo].[simple]
    @sql nvarchar(4000) = null OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT @sql = N'SELECT TOP(5) * FROM aTable'

    EXEC sp_executesql @sql
END

然后只需在您的ADO.NET代码中:

using(var cmd = connection.CreateCommand()) {
    cmd.CommandText = "dbo.simple";
    cmd.CommandType = CommandType.StoredProcedure;
    var sqlParam = cmd.Parameters.Add("sql", SqlDbType.NVarChar, 4000);
    sqlParam.Direction = ParameterDirection.Output;
    // TODO here: ExecuteNonQuery, ExecuteReader, etc, i.e. your existing code
    string sql = (string)sqlParam.Value;
}

答案 2 :(得分:1)

为什么不使用它,@ sql变量需要什么:

CREATE PROCEDURE [dbo].[simple]
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT TOP(5) * FROM aTable
END

C#代码:

    SqlConnection sqlConnection = new SqlConnection("ConnectionString"); 
    SqlCommand cmd = new SqlCommand("simple", sqlConnection);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlDataAdapter adp = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    adp.Fill(ds);

答案 3 :(得分:0)

SqlCommand类具有可用于读取过程的属性CommandText,“获取或设置要在数据源上执行的Transact-SQL语句,表名或存储过程。”您可以找到一些示例here