【发布时间】:2014-11-11 15:52:43
【问题描述】:
我似乎无法弄清楚这个 SQL 标量函数发生了什么。我想知道这是否是我遇到的某种错误,因为 select 语句在函数中返回 NULL,而它在函数外工作得很好,或者当 DESC 子句被省略时。
ALTER FUNCTION [dbo].[getInvoiceNumbers]
(
@vatable bit
)
RETURNS nvarchar(20)
AS
BEGIN
DECLARE @latestNonVATInvNumber nvarchar(20),
@latestVATInvNumber nvarchar(20), @invoiceNumber nvarchar(20)
if @vatable = 'true'
begin
select TOP 1 @latestVATInvNumber = invoiceNumber from dbo.Invoices where vatable = 'true' ORDER BY invoiceID desc
/* remove 'B' from invoice number and convert to int from string */
set @latestVATInvNumber = cast(substring(@latestVATInvNumber,2,len(@latestVATInvNumber)) as int) + 1
/* Add 'B' to receipt number with leading zeros so that it is 7 digits including 'B' */
set @latestVATInvNumber = 'B' + RIGHT('000000'+ CAST(@latestVATInvNumber AS VARCHAR(6)),6)
set @invoiceNumber = @latestVATInvNumber
end
else
begin
select TOP 1 @latestNonVATInvNumber = invoiceNumber from dbo.Invoices where vatable = (select cast ('False' as bit)) ORDER BY invoiceID desc
/* Invoice Number is numeric (non VAT) hence only incrementing it by 1 */
set @latestNonVATInvNumber = cast(cast(@latestNonVATInvNumber as int) + 1 as nvarchar(10))
set @invoiceNumber = @latestNonVATInvNumber
end
-- Return the result of the function
RETURN @invoiceNumber
END
给出NULL的部分是这段代码:
select TOP 1 @latestNonVATInvNumber = invoiceNumber from dbo.Invoices where vatable = (select cast ('False' as bit)) ORDER BY invoiceID desc
和
select TOP 1 @latestVATInvNumber = invoiceNumber from dbo.Invoices where vatable = 'true' ORDER BY invoiceID desc
如果我删除了“DESC”,那么它会给我来自数据库的结果,或者即使插入了“ASC”,但如果在表。
有什么建议吗?
【问题讨论】:
-
vatable列的数据类型是什么? -
'vatable' 列的数据类型是 BIT
标签: sql-server tsql select stored-functions