我有一个简单的存储过程
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#中执行此操作?
答案 0 :(得分:3)
您需要从SPROC明确返回。
此处至少有 3 2个选项
OUT
参数(CREATE PROCEDURE [dbo].[simple] @sql NVARCHAR(MAX) OUT
)RETURN
值(RETURN @sql
)SELECT @sql
作为SPROC的最后一行然后,您需要在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。