【问题标题】:SQL Stored procedure and coding languageSQL 存储过程和编码语言
【发布时间】:2015-05-21 16:24:38
【问题描述】:

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

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

我目前拥有的是这样的:

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

我需要的是一个类似于以下内容的声明。我遇到问题的术语是“字符值”。我找不到“单元格”或字段值的 SQL 术语。我在想可能是“列值”,但这似乎不正确。我确信答案是一个非常基本的答案,我可能想多了。这是代码。

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),'')

【问题讨论】:

  • 您是否在 SQL Server 中寻找 replicate 函数,如 this example 中的函数?请注意,您必须传入一个字符串,而不是 int、int 或 numeric 会截断前导零!
  • 我可以试试复制功能。我还没有考虑过。

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


【解决方案1】:

RIGHT('0'+Unit,3) 将在Unit 前面加上'0' 并返回最右边的3 个字符。

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

【讨论】:

  • 是的,这肯定更有效,但如果该列被索引,它也可能由于 RIGHT() 导致索引扫描。我会先为查询结果设置一个变量,然后应用函数。
  • 鉴于dbo.Supplyvalue(@UserID) 不是表,而是表值函数,并且Unit 不是谓词列,您的“优化”无效。
【解决方案2】:

您可以使用 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

【讨论】:

  • 就是这样!!!我读过 CASE 和 LEN,但不知道如何在适当的上下文中使用。再次感谢您和 xQbert。这些信息都非常有用!
猜你喜欢
  • 2012-01-09
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多