以 C# 中的字符串格式获取存储过程的输出

本文关键字:获取 存储过程 输出 格式 字符串 | 更新日期: 2023-09-27 18:33:47

我有一个返回字符串的存储过程:

DECLARE @SqlStatement VARCHAR(MAX)
SELECT @SqlStatement = 
    COALESCE(@SqlStatement, '') + 'DROP TABLE [TMP].' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'TMP'
PRINT @SqlStatement

我尝试像这样返回字符串:

var con = new SqlConnection(ConfigurationManager.ConnectionStrings["DBBASE"].ConnectionString);
using (var cmd = new SqlCommand("proSQL", con)
{
    CommandType = CommandType.StoredProcedure
})
{
    cmd.Parameters.Add("SqlStatement", SqlDbType.VarChar);
    var returnParameter = cmd.Parameters.Add("@SqlStatement", SqlDbType.VarChar);
    returnParameter.Direction = ParameterDirection.Output;
    con.Open();
    cmd.ExecuteNonQuery();
    var result = returnParameter.Value;
}

当我运行代码时,出现错误:

过程 proSQL 没有参数,并且提供了参数

不确定我做错了什么。有些人可以告诉我如何以字符串格式获取存储过程的输出吗?

以 C# 中的字符串格式获取存储过程的输出

你的SQL应该是这样的,

CREATE PROCEDURE [GetTableNames]
     @schema NVARCHAR(128)
AS
    SELECT
            [TABLE_NAME]
    FROM
            [INFORMATION_SCHEMA].[TABLES]
    WHERE
            [TABLE_SCHEMA] = @schema
RETURN 0;

然后你可以像这样得到你想要的字符串,

var tableNames = new List<string>();
var con = new SqlConnection(
              ConfigurationManager.ConnectionStrings["DBBASE"].ConnectionString);
using (var cmd = new SqlCommand("GetTableNames", con)
        {
            CommandType = CommandType.StoredProcedure
        })
{                 
    cmd.Parameters.Add("@schema", "TMP");    
    con.Open();
    using (var reader = cmd.ExecuteReader())
    {
        while(reader.MoveNext())
        {
            tableNames.Add(reader.GetString(0))
        }
    }
}
var result = string.Join(
    Environment.NewLine,
    tableNames
        .Select(tn => string.Format("DROP TABLE [TMP].[{0}];", tn))
        .ToArray());

SP 中的更改:

DECLARE @SqlStatement VARCHAR(MAX) OUTPUT 

C# 代码中的更改:

var returnParameter = new SQLParameter("@SqlStatement", SqlDbType.VarChar, -1);
returnParameter.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(returnParameter);