我试图使用“+”连接两个字符串,这两个字符串都来自一个子字符串,每个子字符串都从不允许空值的ntext字段转换为varchar(20)。
当我运行代码时,它只接受两个字符串中的第一个,并忽略第二个字符串,因此连接不成功。知道我在做错了什么或错过了吗?
Select Top 100
Substring(Cast(w.WO_Type_Field_02 As nvarchar(20)), 1, 20) As PossFirst,
Substring(Cast(w.WO_Type_Field_04 As nvarchar(20)), 1, (20 -
Len(Substring(Cast(w.WO_Type_Field_02 As nvarchar(20)), 1, 20)) + 1)) As PossLast,
Substring(Cast(w.WO_Type_Field_02 As nvarchar(20)), 1, 20) +
Substring(Cast(w.WO_Type_Field_04 As nvarchar(20)), 1, (20 -
Len(Substring(Cast(w.WO_Type_Field_02 As nvarchar(20)), 1, 20)) + 1)) As PossLogin
from V_WOI_WorkOrder w
我得到的是以下内容:
PossFirst PossLast PossLogin
----------- ----------- -----------
james roberts james
mark smith mark
harry chapman harry
我应该得到的是:
PossFirst PossLast PossLogin
----------- ----------- -----------
james roberts jamesroberts
mark smith marksmith
harry chapman harrychapman
我的子字符串中我的len的原因是完整的连接长度不应该超过20个字符,我还没有完成那部分,但我认为这与连接失败的点无关。< / p>
答案 0 :(得分:0)
嗯,我还不确定这个问题,但我们可以尝试这样做..
SELECT PossFirst, PossLast, ISNULL(PossFirst,'') + ISNULL(PossLast,'') AS PossLogin FROM (
Select
Convert(nvarchar(20),Substring(Cast(w.WO_Type_Field_02 As nvarchar(20)), 1, 20)) As PossFirst,
Convert(nvarchar(20),Substring(Cast(w.WO_Type_Field_04 As nvarchar(20)), 1, (20 -
Len(Substring(Cast(w.WO_Type_Field_02 As nvarchar(20)), 1, 20)) + 1))) As PossLast,
from V_WOI_WorkOrder w
) AS T
编辑:这很奇怪,我有这张表
并尝试了这个
select PossFirst, PossLast, PossFirst + PossLast from (
select
Substring(Cast(w.firstname As nvarchar(20)), 1, 20) As PossFirst
, Substring(Cast(w.lastname As nvarchar(20)), 1, (20 -
Len(Substring(Cast(w.lastname As nvarchar(20)), 1, 20)) + 1)) As PossLast
from nTextDataTypeTest w
) AS T
有了这个结果......
我想知道你有哪些列数据类型,我想知道你正在使用的SQL版本..
编辑:让我们尝试修剪它们。
SELECT PossFirst, PossLast, ISNULL(PossFirst,'') + ISNULL(PossLast,'') AS PossLogin FROM (
Select
Rtrim(Ltrim(Convert(nvarchar(20),Substring(Cast(w.WO_Type_Field_02 As nvarchar(20)), 1, 20)))) As PossFirst,
Rtrim(Ltrim(Convert(nvarchar(20),Substring(Cast(w.WO_Type_Field_04 As nvarchar(20)), 1, (20 -
Len(Substring(Cast(w.WO_Type_Field_02 As nvarchar(20)), 1, 20)) + 1))))) As PossLast,
from V_WOI_WorkOrder w
) AS T
答案 1 :(得分:0)
这里的问题是你的ntext字段包含空格。这些隐藏的角色正在进入你的20个字符限制。
有两种简单的方法可以发现空白。您可以使用LEN函数和/或连接前导和尾随字符。
我使用表变量创建了一个关于堆栈数据交换(下面的链接和代码)的示例。这种方法的好处是我们都可以共享相同的代码。
在这个例子中,james后缀有许多空格。其他记录不是。正如你所看到的,詹姆斯没有姓氏就被退回了。其他人不是。发生这种情况是因为空格计入20个字符的限制。使用RTRIM将删除这些。
SQL Server中的RTRIM仅适用于空格。如果您的空格是由其他控制字符组成的,则需要采用不同的方法。
我用LEFT替换了SUBSTRING,这将在更少的步骤中实现相同的结果。
编辑1:包括原始问题和解决方案的说明。
编辑2:解决OP问题后重写的答案。新答案更好地解释了问题和解决方案。
/* Let's make a variable that we can all share.
*/
DECLARE @SampleData TABLE
(
FirstName NTEXT NOT NULL,
LastName NTEXT NOT NULL
)
;
/* Populate the table with sample values for us
* to experiment with.
* Postfix james with blank spaces.
*/
INSERT INTO @SampleData
(
FirstName,
LastName
)
VALUES
('james ', 'roberts'),
('mark', 'smith'),
('harry', 'chapman')
;
/* CAST and CONCATENATE the NTEXT fields.
* SUBSTRING replaced with LEFT for simplicity.
* Pipe added to end of each string to show its length.
*/
SELECT
FirstName,
LastName,
LEFT(CAST(FirstName AS NVARCHAR(20)) + CAST(LastName AS NVARCHAR(20)), 20) + '|' AS FirstLastName_NoTRIM,
LEFT(RTRIM(CAST(FirstName AS NVARCHAR(20))) + RTRIM(CAST(LastName AS NVARCHAR(20))), 20) + '|' AS FirstLastName_WithTRIM
FROM
@SampleData
;
答案 2 :(得分:0)
使用nText的天气,或者最初从nText字段派生的varchar字段,字符的可视计数与字符上的Len不同,总共1个字符。
字符的视觉计数显示例如12个字符。 [field]上的len显示了13个字符,所以当我将[field]子串到len [field] -1时,如下所示,我可以连接到它。
SUBSTRING([Field], 1, (Len([Field]) - 1)
我们所做的是从尾随隐藏/特殊字符中删除,这阻止了我们连接的工作。
CAST(SUBSTRING([Field], 1, (Len([Field]) - 1) As varchar(20))
然后我们将结果转换为varchar,以匹配我们希望连接的其他字段。
我现在使用下面的字段和表格获得我的最终代码,该代码可以成功运行!
Select Cast(SUBSTRING(w.WO_Type_Field_02,1,(Len(w.WO_Type_Field_02)-1)) As varchar(20)) As PossFirst,
Substring(Cast(w.WO_Type_Field_04 As nvarchar(20)), 1, (20 -
Len(Substring(Cast(w.WO_Type_Field_02 As nvarchar(20)), 1, 20)) + 1)) As PossLast,
Cast(SUBSTRING(w.WO_Type_Field_02,1,(Len(w.WO_Type_Field_02)-1)) As varchar(20)) + '.' +
Substring(Cast(w.WO_Type_Field_04 As nvarchar(20)), 1, (20 -
Len(Substring(Cast(w.WO_Type_Field_02 As nvarchar(20)), 1, 20)) + 1)) As PossLogin
from V_WOI_WorkOrder w