【问题标题】:Sql Query problems with Case, Replicate and Trim functions使用 Case、Replicate 和 Trim 函数的 Sql Query 问题
【发布时间】:2015-03-24 12:29:35
【问题描述】:

我的 SQL 查询有一些问题。表名是 debitorders,由以下列组成:

  1. 名字(varchar(50),null)
  2. (varchar(50),null)
  3. 帐号(varchar(50),null)
  4. accounttype (varchar(50),null)
  5. 银行名称​​(varchar(50),null)
  6. 分支(varchar(50),null)
  7. 金额(varchar(50),null)
  8. 日期(日期,空)

这是我们目前的查询:

SET @BankName = 'ABSA'
--SET @BankName = 'First National Bank'
SET @QueryResultA = (SELECT CASE @BankName 
                     WHEN 'ABSA' THEN 'ABSA            0040000146162'
                     WHEN 'First National Bank' THEN 'First National B0020000045603'
                     END)
--PRINT @QueryResultA
SET @Amount = (SELECT amount FROM debitorders)
SELECT
       left(LTRIM(RTRIM(firstname)),1) + '' + CONVERT (varchar(15),LTRIM(RTRIM(surname)),1),
       (SELECT left(cast(LTRIM(RTRIM(accountnumber)) as varchar(14))+replicate(' ',14),14) ),
       CASE accounttype 
         WHEN 'cheque' 
            THEN left(cast('CH' as varchar(3))+replicate(' ',3),3) 
         WHEN 'savings' 
            THEN left(cast('SAV' as varchar(3))+replicate(' ',3),3)
         WHEN 'credit card' 
            THEN left(cast('CC' as varchar(3))+replicate(' ',3),3)
         WHEN 'other' 
            THEN left(cast('OTH' as varchar(3))+replicate(' ',3),3)
      END, 
      left(cast(LTRIM(RTRIM(branch)) as varchar(10))+replicate(' ',10),10),   
      REPLICATE('0', 7 - DATALENGTH (REPLACE(amount,'.',''))) + LTRIM(RTRIM(REPLACE(amount,'.',''))),
      REPLACE(CONVERT(VARCHAR, date,103),'/','') AS DebitDate
      --REPLACE(CONVERT(VARCHAR(10), date, 104) AS [DD.YYYY.MM]),'.',''
FROM debitorders
WHERE bankname = @BankName

结果应该是:

  1. 名字(垫边:n/a,长度:1)
  2. 姓氏(垫边:右,长度:15)
  3. 帐号(垫边:右,长度:14)
  4. accounttype(pad侧:右,长度:3)
  5. 分支(垫侧:右,长度:10)
  6. 数量(焊盘侧:左,长度:7)
  7. 日期(焊盘侧:n/a,长度:8,设置格式为 ddyyyymm)

为什么无法识别列?

【问题讨论】:

  • 我对你想要做什么有点困惑。通常,当使用 VARCHAR 数据类型时,它只存储实际值而不是额外的空格。如果要存储空间,则应考虑 CHAR 数据类型。您还可以从 SSMS 添加实际的错误消息。请列出您的 SQL Server 版本。
  • 应该发生的是例如姓氏,获取姓氏并在姓氏右侧添加空格,以便所有姓氏和空格的长度为15。错误消息是这样的:Msg 208, Level 16, State 1, Line 12 无效的对象名称'debitorders'。 Sql Server 版本是 2012
  • 您的代码发生了一些奇怪的事情。您有一个已设置但未使用的 QueryResultsA 变量。然后你从借方设置一个变量。但是该查询没有 where 子句,也没有聚合,这意味着它将从返回的最后一行中获取值。由于您没有订单,您甚至不知道它是哪一行。但是,无论如何您都不会使用该变量,因此不确定它的意义。
  • 当您说无法识别列时,您是在谈论运行查询时还是您刚刚创建了表并且它们带有红色曲线下划线?我怀疑是这样的。你只需要刷新本地缓存(ctrl + shift + r)

标签: sql-server tsql case trim replicate


【解决方案1】:

您是否针对正确的数据库运行查询?您的 debitorders 表是在哪里创建的?

我会说首先检查您没有针对主数据库运行查询。

此链接有更多信息:http://blog.sqlauthority.com/2012/08/31/sql-server-error-fix-msg-208-invalid-object-name-dbo-backupset-invalid-object-name-dbo-backupfile/

【讨论】:

  • 我不敢相信。是的,我们在主服务器上运行它!我现在觉得真的很愚蠢xD谢谢!它运行但我仍然收到一条错误消息,提示消息 512、级别 16、状态 1、第 13 行子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。由于某种原因,当保存为 txt 文件时,它本身的数量之后有很多空格。可能是它实际上取了金额并将其乘以 7 而不是将金额的长度设置为 7?
  • 没问题,我时不时也会出现这种情况。我认为这与您的“SET @Amount = (SELECT amount FROM debitorders)”有关,它会返回多个值,然后尝试将其设置为变量
【解决方案2】:

你需要声明你的变量:

DECLARE @BankName VARCHAR(50) = 'ABSA';

您还尝试在 @Amount 变量中设置多条记录。你需要在这里聚合吗?

【讨论】:

  • Richard Nixion,不,我不知道,这里不需要进行任何计算。它只应该带回借记单中的金额并且长度为 7,去掉“。”并添加零。
猜你喜欢
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多