2

我有一个简单的存储过程

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

4 回答 4

3

您需要从 SPROC 中明确返回它。

你至少有3这里有2个选项

  1. 一个OUT参数 ( CREATE PROCEDURE [dbo].[simple] @sql NVARCHAR(MAX) OUT)
  2. 一个RETURN值 ( RETURN @sql)
  3. 就像SELECT @sql你的 SPROC 的最后一行

然后,您需要在 C# 代码中将其绑定到适当的技术中

编辑返回不起作用 -仅限整数表达式

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'),这将是第二个。

于 2012-08-30T09:14:34.580 回答
3

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

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;
}
于 2012-08-30T09:23:28.863 回答
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);
于 2012-08-30T09:22:06.150 回答
0

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

于 2012-08-30T09:17:49.337 回答