ВЫБРАТЬ ИЗ хранимой процедуры? - PullRequest
0 голосов
/ 17 сентября 2010

Если у меня есть сохраненный процесс в SQL Server 2008, я знаю, что могу запустить его из Management Studio следующим образом:

exec rpt_myproc @include_all = 1, @start_date = '1/1/2010'

Но я использую специальный инструмент запросов, который не былвозвращая любые результаты.Поэтому я попросил дать мне SQL, который он выполнял, и он возвращает это:

SELECT DISTINCT TOP 100000
[dbo].[rpt_myproc].[company_name] AS 'company name',
[dbo].[rpt_myproc].[order_number] AS 'order number]
FROM [dbo].[rpt_myproc]
WHERE 
([dbo].[rpt_myproc].[PARAM_start_date] IN ('1/1/2010'))
AND ([dbo].[rpt_myproc].[PARAM_include_all] IN ('1'))

Я не знаком с этим синтаксисом.Это вообще возможно?Специальный инструмент не выходит из строя, но он может поглотить эту ошибку.Опять же, может быть, это просто дает мне стенографию, которая позже будет использоваться для перевода в правильный синтаксис.Но если это так, то почему он дал бы его мне в этой форме?

Я не могу заставить этот SQL-код работать в Management Studio, поэтому мне было интересно, возможно ли что-то подобное?

Ответы [ 4 ]

1 голос
/ 24 декабря 2013

Я понимаю, что этому больше 3 лет, но в случае, если кто-то еще ищет ответ на этот вопрос.Мне приходилось иметь дело с этой платформой отчетности, Izenda, и я обнаружил, что хранимые процедуры обрабатываются иначе, чем вывод значка «sql».Вот что происходит, когда вы выбираете sp в качестве источника данных

  1. Динамический sql это build
  2. Он создает две временные таблицы со всеми столбцами, которые ваш sp возвращает
  3. Первая временная таблица заполняется результатом вашей хранимой процедуры
  4. Вторая временная таблица заполняется результатом плюс значение вашего входного параметра.
  5. Создается оператор, которыйзапрашивает эти две временные таблицы

Обратите внимание, что если вы не передадите ему параметр, он будет работать со значением по умолчанию пустой строки '', которая, скорее всего, не вернет никаких данных.

По моему мнению, ужасная идея обращаться с хранимыми процессами, что является хорошей причиной, почему мы планируем отбросить их для какого-то другого решения для создания отчетов.

0 голосов
/ 17 сентября 2010

Какой инструмент вы используете?Вы должны быть в состоянии указать тип запроса (т. Е. SQL или хранимый процесс и т. Д.)

Ранее вы не пользовались этим инструментом, но быстрый пример Google нашел этот пример (не уверен, поможет ли он вам)

Using a stored procedure in 5.x

This example uses a stored procedure to populate a table before report design or execution. As shown in the comments, the table StoredProcResults must already exist. Every time a report is created or viewed this stored procedure will update the results of the StoredProcResults table. For 6.x follow these instructions but treat the SP as a regular datasource.
// Customize a report on the fly prior to execution on a per user basis

public override void PreExecuteReportSet(Izenda.AdHoc.ReportSet reportSet){    
    /*this sample uses the adventure works database    Here is the definition of the table and     stored procedure created for this report.     
        CREATE TABLE [dbo].[StoredProcResults](    
            [ProductID] [int] NOT NULL,    
            [OrderQuantity] [int] NOT NULL,    
            [Total] [int] NOT NULL,    
            [DueDate] [smalldatetime] NOT NULL    
        ) ON [PRIMARY]    

        CREATE PROCEDURE DoCustomAction (
            @date1 as smalldatetime,
            @date2 as smalldatetime    
        )   AS    
        BEGIN    
            insert into StoredProcResults    
            select ProductID,OrderQty,LineTotal,ModifiedDate    
            from Sales.SalesOrderDetail    
            where ModifiedDate >= @date1 and ModifiedDate <= @date2    
        END    
    */    

    string currentReportName =    HttpContext.Current.Request.QueryString["rn"];    
    if (currentReportName == "StoredProcExample")    {
        SqlConnection myConnection = new SqlConnection(Izenda.AdHoc.AdHocSettings.SqlServerConnectionString);        
        SqlCommand myCommand = new SqlCommand("DoCustomAction", myConnection);        
        // Mark the Command as a SPROC        
        myCommand.CommandType = System.Data.CommandType.StoredProcedure;        
        // Add Parameters to SPROC        
        SqlParameter parameterdate1 = new SqlParameter("@date1", System.Data.SqlDbType.SmallDateTime);        
        parameterdate1.Value = "1/1/2003";        
        myCommand.Parameters.Add(parameterdate1);        
        SqlParameter parameterdate2 = new SqlParameter("@date2", System.Data.SqlDbType.SmallDateTime);        
        parameterdate2.Value = "12/31/2003";        
        myCommand.Parameters.Add(parameterdate2);        

        try{            
            myConnection.Open();            
            myCommand.ExecuteNonQuery();        
        }
        finally{            
            myConnection.Close();        
        }    
    }
}
0 голосов
/ 21 сентября 2010

Вы уверены, что это спрок? Я никогда не слышал и не видел использования прямого выбора из sproc.

То, что я видел , которое работает и работает точно так же, как кажется, работает ваш код, это табличные функции , которые являются функциями, которые могут принимать параметры и возвращать "SELECT FROM способная "таблица точно такая же (по сути, она дает вам" параметризованное "представление).

0 голосов
/ 17 сентября 2010

Вы можете вставить первый набор результатов хранимой процедуры во временную таблицу:

SELECT  *
INTO    #YourProc
FROM    OPENROWSET('SQLNCLI', 
            'server=SERVERNAME\INSTANCENAME;trusted_connection=yes',
            'set fmtonly off; exec rpt_myproc')

Есть 3 способа сделать это, см. это сообщение в блоге .Если вы знаете вывод заранее, вы можете сделать это без удаленного запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...