Sql server 如何将查询转换为函数
我正在玩弄一个来自软件合作伙伴的查询,这个查询不是我创建的。我试图将它用作一个可以插入到表中的函数,因为我不是sql专家,我在使用sintax时遇到了困难 多亏了你的建议,我正在取得进展,现在我被困在如何添加一个额外的select以包括一些联接表上,我已经禁用了将其转换为注释的部分。这实际上没有最终选择,但我需要最终选择,有什么想法吗Sql server 如何将查询转换为函数,sql-server,tsql,stored-functions,nested-queries,Sql Server,Tsql,Stored Functions,Nested Queries,我正在玩弄一个来自软件合作伙伴的查询,这个查询不是我创建的。我试图将它用作一个可以插入到表中的函数,因为我不是sql专家,我在使用sintax时遇到了困难 多亏了你的建议,我正在取得进展,现在我被困在如何添加一个额外的select以包括一些联接表上,我已经禁用了将其转换为注释的部分。这实际上没有最终选择,但我需要最终选择,有什么想法吗 alter function Renetest ( @companytest nvarchar(8), @fiscalyeartest int ) retur
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
该函数返回一个表。只需使用INSERT语句从函数中进行选择
INSERT INTO dbo.MyTable
SELECT Company, BookID
FROM Renetest();
这正是你所要求的。但这可以转换为存储过程,避免同时使用函数。使用最少的代码提问。即使这个函数是问题所在,也有太多的代码,因为它是重复的。针对您的问题,您的研究和最小代码出现了什么?请在代码问题中给出一个-cut&paste&runnable代码;作为初始化代码的示例输入,所需和实际输出包括逐字错误消息;标签和版本;清晰的说明和解释。这包括您能给出的最少代码,即您显示为OK的代码,由您显示为not OK的代码扩展。调试基础。对于包含DBMS/product和DDL的SQL,其中包括约束和索引以及表格格式的基表初始化。PS您有一个语法错误。阅读语法和手册。显示组成子表达式是可以的。同意它有点太长了。你读过MSDN文档了吗?表值函数只能包含1条语句。阅读关于不同类型函数的文档。什么是卡住?怎么卡住的?出错?值错误?函数还不能工作,我有一个错误:关键字“Declare”附近的语法不正确。@RockRoad“AS”之后的关键字RETURN应该在最后一次选择之前。Declare的sintax仍然无效