繁体   English   中英

C#和SQL Server:执行存储过程

[英]C# & SQL Server : execute stored procedure

我在存储过程中有一个SQL查询,但出现错误。

这是查询:

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”。

我尝试用多种方法声明,但是没有任何效果。 抱歉,我是新手,要解决这个问题对我来说有点困难。

使用GO分隔批次,删除动态SQL并将CREATE PROCEDURE替换为CREATE FUNCTION

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
)

编辑:

GO是在SSMS内运行的批处理分隔符。 如果要从C#执行它,请进行两个单独的调用。 首先是DROP FUNCTION ,然后重新创建它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM