【发布时间】:2015-03-24 12:29:35
【问题描述】:
我的 SQL 查询有一些问题。表名是 debitorders,由以下列组成:
- 名字(varchar(50),null)
- 姓(varchar(50),null)
- 帐号(varchar(50),null)
- accounttype (varchar(50),null)
- 银行名称(varchar(50),null)
- 分支(varchar(50),null)
- 金额(varchar(50),null)
- 日期(日期,空)
这是我们目前的查询:
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
结果应该是:
- 名字(垫边:n/a,长度:1)
- 姓氏(垫边:右,长度:15)
- 帐号(垫边:右,长度:14)
- accounttype(pad侧:右,长度:3)
- 分支(垫侧:右,长度:10)
- 数量(焊盘侧:左,长度: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