【问题标题】:How to convert a query to a a function如何将查询转换为函数
【发布时间】:2019-09-17 16:31:22
【问题描述】:

我正在处理来自不是我创建的软件合作伙伴的查询。我正在尝试将它用作我可以插入到表中的函数,因为我不是 sql 专家,我在使用 sintax 时遇到了困难。

感谢您的建议,我正在取得进展,现在我被困在如何添加额外的选择以包含一些连接表,我已禁用该部分将其转换为评论。这实际上可以在没有最终选择的情况下工作,但我需要最终选择,有什么想法吗?

alter function Renetest

(
@companytest nvarchar(8),
@fiscalyeartest int
)

returns @PERIODBALANCE TABLE
    (
     [Company] NVARCHAR(8)
    ,[BookID] NVARCHAR(12)
    ,[BalanceAcct] NVARCHAR(200)
    ,[FiscalYear] INT
    ,[FiscalPeriod] INT
    ,[BalanceType] NVARCHAR(1)
        ,[SegValue1] NVARCHAR(50)
    ,[SegValue2] NVARCHAR(50)
       ,[FiscalYearSuffix] NVARCHAR(8)
    ,[FiscalCalendarID] NVARCHAR(12)
    )
    as
    begin


Declare @company nvarchar(8);
Declare @fiscalyear INT;
DECLARE @FiscalPeriod INT;
Set @company = 'epic03'
set @Fiscalyear =  '2013'
SET @FiscalPeriod=0;
DECLARE @MaxPeriod AS NVARCHAR(20);
SET @MaxPeriod=(
                SELECT
                    MAX([Erp].[GLBookPer].[FiscalPeriod])
                FROM
                    [Erp].[GLBookPer] WITH (NOLOCK)
                WHERE
                    [Erp].[GLBookPer].[Company] IN (@company)
                    AND [Erp].[GLBookPer].[FiscalYear]=@FiscalYear
               );


WHILE @FiscalPeriod<=(@MaxPeriod)
    BEGIN
        INSERT  INTO @PERIODBALANCE
                (
                 [Company]
                ,[BookID]
                ,[BalanceAcct]
                ,[FiscalYear]
                ,[FiscalPeriod]
                ,[BalanceType]
                ,[SegValue1]
                ,[SegValue2]
                ,[FiscalYearSuffix]
                ,[FiscalCalendarID]
                )
                SELECT
                    [Erp].[GLPeriodBal].[Company]
                   ,[Erp].[GLPeriodBal].[BookID]
                   ,[Erp].[GLPeriodBal].[BalanceAcct]
                   ,[Erp].[GLPeriodBal].[FiscalYear]
                   ,@FiscalPeriod AS [FiscalPeriod]
                   ,[Erp].[GLPeriodBal].[BalanceType]
                   ,[Erp].[GLPeriodBal].[SegValue1]
                   ,[Erp].[GLPeriodBal].[SegValue2]
                    ,[Erp].[GLPeriodBal].[FiscalYearSuffix]
                   ,[Erp].[GLPeriodBal].[FiscalCalendarID]
                FROM
                    [Erp].[GLPeriodBal] WITH (NOLOCK)
                WHERE
                    [Erp].[GLPeriodBal].[Company] IN (@company)
                    AND [Erp].[GLPeriodBal].[FiscalYear]=@FiscalYear
                    AND [Erp].[GLPeriodBal].[FiscalPeriod]<=@FiscalPeriod
                    AND [Erp].[GLPeriodBal].[BalanceType] IN ('D','B')

        SET @FiscalPeriod=@FiscalPeriod+1;  
        end;

/*
SELECT
    LTRIM(RTRIM([PERIODBALANCE].[Company])) AS [Company]
   ,LTRIM(RTRIM([PERIODBALANCE].[BookID])) AS [BookID]
     ,LTRIM(RTRIM(REPLACE([PERIODBALANCE].[BalanceAcct],'|','-'))) AS [BalanceAcct]
    ,LTRIM(RTRIM(ISNULL(NULLIF([PERIODBALANCE].[BalanceType],''),'--'))) AS [BalanceType]
     ,LTRIM(RTRIM(ISNULL(NULLIF([PERIODBALANCE].[FiscalYearSuffix],''),'--'))) AS [FiscalYearSuffix]
   ,LTRIM(RTRIM(ISNULL(NULLIF([PERIODBALANCE].[FiscalCalendarID],''),'--'))) AS [FiscalCalendarID]

FROM
    @PERIODBALANCE AS [PERIODBALANCE]*/

    return
    end

    go

【问题讨论】:

  • 使用 minimal 代码来提出您的问题。即使这个函数有问题,也有太多的代码,因为它是重复的。您的研究和最少的代码为您的问题“插入表格”提供了什么?
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)对于包含 DBMS/产品和 DDL 的 SQL,其中包括约束和索引以及表格格式的基表初始化。 PS你有一个语法错误。阅读语法和手册。显示组成子表达式是好的。
  • 同意有点太长了
  • 您阅读过 MSDN 文档吗?表值函数只能包含 1 条语句。阅读有关不同类型函数的文档。
  • 卡住是什么意思?卡住了怎么办?出错了?值错误?

标签: sql-server tsql stored-functions nested-queries


【解决方案1】:

函数返回一个表。只需使用 INSERT 语句从函数中进行选择。

INSERT INTO dbo.MyTable
SELECT Company, BookID
  FROM Renetest();

这正是您所要求的。但这可以转换为存储过程,避免一起使用函数。

【讨论】:

  • 该功能还不能工作,我有错误:关键字'Declare'附近的语法不正确。
  • @RockRoad 'AS' 之后的关键字 RETURN 应该在最后一个 SELECT 之前。
  • 仍然收到无效的声明声明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 2021-10-11
  • 2021-02-13
相关资源
最近更新 更多