2017-08-10 20 views
2

ストアドプロシージャ内にSQLクエリがあり、エラーが発生します。ここでC#およびSQL Server:ストアドプロシージャを実行

はクエリです:

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fPartnersDebt]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
    DROP FUNCTION [dbo].[fPartnersDebt] 

/****** Object: UserDefinedFunction [dbo].[fPartnersDebt] Script Date: 03/07/2012 16:02:01 ******/ 
SET ANSI_NULLS ON 

SET QUOTED_IDENTIFIER ON 

exec('CREATE PROCEDURE [dbo].[fPartnersDebt]') 
( 
    @StartDate datetime 
    ,@EndDate datetime 
    ,@CompanyName nvarchar(100) 
    ,@Account nvarchar(100) 
    ,@Reference nvarchar(max) 
    ,@ShowClosedDocuments bit 
) 
RETURNS TABLE 
AS 
    RETURN 
     (SELECT 
      t1.Name, t1.Bulstat, t1.Amount, t1.IsVat 
     FROM 
      (SELECT 
        c.CompanyID, c.Name AS [Name], c.IsVat, c.Bulstat AS [Bulstat], 
        SUM((ad.Amount + ad.RefAmount) * ad.[Sign]) AS [Amount] 
       FROM 
        Companies c 
       JOIN 
        AccountingDetails ad 
       JOIN 
        Accounts a 
       JOIN 
        AccountCategories ac ON ac.AccountCategoryID = a.AccountCategoryID 
        ON ad.AccountID = a.AccountID 
       JOIN 
        Accountings acc ON ad.AccountingID = acc.AccountingID 
        ON ad.CompanyID = c.CompanyID 
       LEFT JOIN 
        [References] r ON acc.OptionalReferenceID = r.ReferenceID 
       WHERE 
        ac.TypeIdentifier IN (4, 6, 7, 8, 9, 20, 33, 54, 10, 12, 13, 14, 15, 19, 34, 55) 
        AND Name LIKE @CompanyName 
        AND (a.Number = @Account OR a.Number LIKE @Account + '/%' OR (Len(@Account) < 3 AND a.Number LIKE @Account + '%')) 
        AND acc.AccountingDate >= @StartDate 
        AND acc.AccountingDate <= @EndDate 
        AND (ISNULL(r.[Description], '') LIKE @Reference + '%') 
       GROUP BY 
        c.CompanyID, c.Name, c.Bulstat, c.IsVat) t1 
    WHERE 
     @ShowClosedDocuments = 1 OR t1.Amount <> 0 
) 

エラー:近く

不適切な構文 '@StartDate'。

スカラー変数 "@CompanyName"を宣言する必要があります。

多くの方法で宣言しようとしますが、何も動作しません。申し訳ありませんが、私は新しく、この問題を解決するのは少し難しいです。

答えて

6

使用GO、バッチを分離動的SQLを除去し、CREATE FUNCTIONCREATE PROCEDUREを交換する:

SET ANSI_NULLS ON 
SET QUOTED_IDENTIFIER ON 
GO 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fPartnersDebt]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
DROP FUNCTION [dbo].[fPartnersDebt] 
GO  -- here 


CREATE FUNCTION [dbo].[fPartnersDebt] -- here 
( 
    @StartDate datetime 
    ,@EndDate datetime 
    ,@CompanyName nvarchar(100) 
    ,@Account nvarchar(100) 
    ,@Reference nvarchar(max) 
    ,@ShowClosedDocuments bit 
) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT 
     t1.Name 
     ,t1.Bulstat 
     ,t1.Amount 
     ,t1.IsVat 
    FROM 
     (SELECT 
      c.CompanyID 
      ,c.Name AS [Name] 
      ,c.IsVat 
      ,c.Bulstat AS [Bulstat] 
      ,SUM((ad.Amount + ad.RefAmount) * ad.[Sign]) AS [Amount] 
     FROM Companies c 
      JOIN AccountingDetails ad 
       JOIN Accounts a 
        JOIN AccountCategories ac ON ac.AccountCategoryID = a.AccountCategoryID 
       ON ad.AccountID = a.AccountID 
       JOIN Accountings acc ON ad.AccountingID = acc.AccountingID 
      ON ad.CompanyID = c.CompanyID 
      LEFT JOIN [References] r ON acc.OptionalReferenceID = r.ReferenceID 
     WHERE ac.TypeIdentifier IN (4,6,7,8,9,20,33,54,10,12,13,14,15,19,34,55) 
       AND Name LIKE @CompanyName 
       AND (a.Number = @Account OR a.Number LIKE @Account + '/%' OR (Len(@Account)<3 AND a.Number LIKE @Account + '%')) 
       AND acc.AccountingDate >= @StartDate AND acc.AccountingDate <= @EndDate 
       AND (ISNULL(r.[Description], '') LIKE @Reference + '%') 
     GROUP BY 
      c.CompanyID 
      ,c.Name 
      ,c.Bulstat 
      ,c.IsVat)t1 
    WHERE @ShowClosedDocuments = 1 OR t1.Amount <> 0 
) 

EDIT:

GOSSMS内部動作バッチセパレータです。 C#から実行したい場合は、2回の別々の呼び出しを行います。最初にとしてから再作成してください。

+0

エラー: System.Data.SqlClient.SqlException(0x80131904): 'GO'付近の構文が正しくありません。 'GO'付近の構文が正しくありません。 'CREATE FUNCTION'はクエリバッチの最初の文でなければなりません。 スカラー変数 "@CompanyName"を宣言しなければなりません。 –

+0

@ДимитърГрудевそうなら、 'C#'からそれを実行して、それを1つではなく2つの呼び出しで呼び出します。 – lad2025

+0

はい私はc#で実行します。申し訳ありませんが、私は新しいです。コードで私を見せてもらえますか? –

関連する問題