SQL存储过程和编码语言

时间:2015-05-21 16:24:39

标签: sql sql-server sql-server-2008 stored-procedures sqlcode

所以我正在编写SQL服务器(2008 R2)上的现有存储过程。由于我对SQL的入门级知识,我遇到了一些问题。问题是此生成的报告的要求已更改,并且字段的值已从2更改为3.报告的字段长度已由上一个用户更改,但它们从未考虑过数据中的数据。字段仅等于2个字符。 I.E. 20或03而不是100.这导致报告生成如下值:   '03 XX'而不是003XX 这是一个问题,因为接收它的系统从右到左读取它,因此它将看到这些Null值并拒绝整个报告。

我想要做的是将现有的SET语句更改为条件语句,当字段值的长度仅为2个字符时,该条件语句会添加填充“0”。

我现在的目的是:

SET @SupplyQuan = ISNULL((SELECT Unit FROM dbo.Supplyvalue(@UserID)
                              WHERE Number = 3),'')

我需要的是一个类似于以下内容的声明。我遇到麻烦的一词是“Charactervalue”。我找不到“单元格”或字段值的SQL术语。我当时想的可能是“Columnvalue”,但这似乎不正确。我相信答案是非常基本的,我可能会过度思考这个问题。这是代码。

SET @SupplyQuan = ISNULL((SELECT Unit FROM dbo.Supplyvalue(@UserID)
                              WHERE Number = 3),'') IF “Charactervalue=3” ELSE IF “Charactervalue=2” THEN
SET @SupplyQuan = ISNULL('0'+(SELECT Unit FROM dbo.Supplyvalue(@UserID)
                              WHERE Number = 3),'')

2 个答案:

答案 0 :(得分:1)

RIGHT('0'+Unit,3)Unit添加'0'前缀,并返回最右边的3个字符。

SET @SupplyQuan = ISNULL((SELECT RIGHT('0'+Unit,3) FROM dbo.Supplyvalue(@UserID) WHERE Number = 3),'')

答案 1 :(得分:-1)

您可以使用CASE语句和LEN()函数。

SELECT @SupplyQuan = case 
    when (len(Unit) = 3) then Unit
    when (len(Unit) = 2) then '0' + Unit
    else ''
END
FROM dbo.Supplyvalue(@UserID)
WHERE Number = 3

但是我会首先检查查询计划,如果由于列名称上的功能而看到太多扫描,我就会将其分解。

declare @x varchar(3)
select @x = Unit FROM dbo.Supplyvalue(@UserID) WHERE Number = 3
select @SupplyQuan = CASE
    WHEN (len(@x) = 3) then Unit
    WHEN (len(@x) = 2) then '0' + Unit
    ELSE ''
end