1

Сначала у меня есть веб-приложение ASP.NET MVC и код Entity Framework. Я использую хранимую процедуру и представления и функции для своего раздела отчета в своем проекте. Затем я хочу, чтобы после обновления моей базы данных эти хранимые процедуры и представления и функции dos не очищались и не падали после обновления. Я использую этот путь, и я хочу проверить, не существует ли этот объект, а затем создать его, но когда я запустил этот код, ящик пакета Nuget сказал, что «CREATE/ALTER PROCEDURE» должно быть первым оператором в пакете запросов.Как проверить наличие хранимой процедуры и просмотреть и использовать в методе семени Entity Framework?

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

context.Database.ExecuteSqlCommand(@"IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'stp_Report1-2') 
    SET ANSI_NULLS ON 
    SET QUOTED_IDENTIFIER ON 

CREATE PROCEDURE [dbo].[stp_Report1-2] 
    @startDate char(10), 
    @endDate char(10), 
    @ContractorTitle nvarchar(100) 

    AS 
BEGIN 
    -- setting the smallest date to filter 
    if(@startDate is null) SET @startDate='1300/01/01' 
    --setting the end date the current date if it has not been set 
    if(@endDate is null)SET @endDate=dbo.GetShamsiDate(GetDate()) 
    if(@ContractorTitle is null)SET @ContractorTitle='' 
    SELECT * 
    from Raja.dbo.[Report1-2] 
     where [contractor_title][email protected] and export_date between @startDate and @endDate 
     Order by export_date desc 


END 

"); 

и когда Я использую этот код вместо кода, я получаю эту ошибку в Nuget

Неправильный синтаксис около 'GO'.
Неправильный синтаксис около 'GO'.
«CREATE/ALTER PROCEDURE» должно быть первым оператором в пакете запросов.

Код:

context.Database.ExecuteSqlCommand(@"IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'stp_Report1-2') 
    SET ANSI_NULLS ON 
GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
CREATE PROCEDURE [dbo].[stp_Report1-2] 
    @startDate char(10), 
    @endDate char(10), 
    @ContractorTitle nvarchar(100) 

    AS 
BEGIN 
    -- setting the smallest date to filter 
    if(@startDate is null) SET @startDate='1300/01/01' 
    --setting the end date the current date if it has not been set 
    if(@endDate is null)SET @endDate=dbo.GetShamsiDate(GetDate()) 
    if(@ContractorTitle is null)SET @ContractorTitle='' 
    SELECT * 
    from Raja.dbo.[Report1-2] 
     where [contractor_title][email protected] and export_date between @startDate and @endDate 
     Order by export_date desc 


END 

"); 

и если я использую этот код эти ошибки

Неправильный синтаксис около ключевого слова 'PROCEDURE'.
Должен объявить скалярную переменную «@startDate».
Должен объявить скалярную переменную «@startDate».
Должен объявить скалярную переменную «@endDate».
Должен объявить скалярную переменную «@endDate».
Должен объявить скалярную переменную "@ContractorTitle".
Должен объявить скалярную переменную "@ContractorTitle".
Должен объявить скалярную переменную "@ContractorTitle".

Код:

context.Database.ExecuteSqlCommand(@"IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'stp_Report1-2') 

CREATE PROCEDURE [dbo].[stp_Report1-2] 
    @startDate char(10), 
    @endDate char(10), 
    @ContractorTitle nvarchar(100) 

    AS 
BEGIN 
    -- setting the smallest date to filter 
    if(@startDate is null) SET @startDate='1300/01/01' 
    --setting the end date the current date if it has not been set 
    if(@endDate is null)SET @endDate=dbo.GetShamsiDate(GetDate()) 
    if(@ContractorTitle is null)SET @ContractorTitle='' 
    SELECT * 
    from Raja.dbo.[Report1-2] 
     where [contractor_title][email protected] and export_date between @startDate and @endDate 
     Order by export_date desc 
END 
"); 
+2

Вы можете выполнить ute только ** одна ** команда за раз с * ExecuteSqlCommand *. –

+0

, то как я могу получить его до одной команды? –

+0

Это может помочь: http://stackoverflow.com/questions/8809485/how-can-i-define-a-stored-procedure-in-entity-framework-code-first – Mike

ответ

0

Сначала выполнить эту statemment:

SELECT COUNT(*) FROM sys.objects WHERE type = 'P' AND name = 'stp_Report1-2' 

Это вернет 0 или 1.

Затем в C# код проверить возвращаемое значение, если оно 0, запустите свой код хранимой процедуры.

+0

спасибо за ваш ответ. Я использую этот код для проверки существования процедуры. –

+0

var ExistVW4 = context.Database.SqlQuery (@ "SELECT CASE КОГДА НЕ существует (SELECT * FROM sys.views WHERE name = 'Report1-4') THEN 0 ELSE 1 END "); if (ExistVW4.First() == 0) –

0

Вы можете избежать того, чтобы вернуть результат IF EXISTS вызова C# по всегда делает DROP и CREATE, и вы можете избежать

должен быть первым оператором в пакетном файле

ошибку, поставив SQL внутри EXEC команды:

Sql(EXEC('IF EXISTS (SELECT * 
         FROM sys.objects 
         WHERE object_id = OBJECT_ID(N'dbo.Foos') 
         AND type in (N'P', N'PC')) 
      DROP PROCEDURE dbo.Foos') 

Sql(EXEC('Create PROCEDURE dbo.Foos As etc')) 

Проблема с утверждением GO является то, что

это не Transact-SQL заявление; это команда распознается SQLCMD и Osql утилиты и редактор SQL Management Server Studio Code

Ссылки:

Issue with Sql GO

MSDN

1

Вы можете проверить, что делает следующее:

protected override void Seed(DbContext context) 
{ 
    if (context.Database.SqlQuery<int>("SELECT COUNT(*) FROM sys.objects WHERE type = 'P' AND name = @uspName", 
             new SqlParameter("@uspName", "your stored procedure name")).Single() == 0) 
    { 
     -- // On the example below I am using a resource file named StoredProcedures, which has the t-sql 
     context.Database.ExecuteSqlCommand(DatabaseScripts.StoredProcedures.your stored procedure name); 
    } 
} 
Смежные вопросы