2014-12-09 2 views
0

У меня есть хранимая процедура, которая возвращает строку:Получить выход для хранимой процедуры в формате строка в C#

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; 
} 

Когда я запускаю код, я получаю ошибку:

Procedure proSQL has no parameters and arguments were supplied

Я не уверен, что я делаю неправильно. Может кто-нибудь, пожалуйста, скажите мне, как получить результат для хранимой процедуры в формате строки?

+1

где '@ ReturnVal' является SP –

+0

@Ganesh_Devlekar Нет, только что отредактировал вопрос – nate

+0

Я тоже думал о возврате, но нет. Используйте returnParameter.Direction = ParameterDirection.Output вместо – Jauch

ответ

0

Изменение SP:

DECLARE @SqlStatement VARCHAR(MAX) OUTPUT 

Изменение в C# код:

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

Я получил ошибку: String [1]: свойство Size имеет недопустимый размер 0. – nate

+0

@nate, вы должны указать размер параметра varchar. Попробуйте использовать -1. Пример: http://msdn.microsoft.com/en-us/library/a1904w6t%28VS.80%29.aspx – Jauch

+0

Это ошибки: cmd.ExecuteNonQuery(); – nate

0

ваш 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()); 
Смежные вопросы