SQL Server串联不使用加号

时间:2015-12-05 12:24:07

标签: sql-server concatenation string-concatenation

我试图使用“+”连接两个字符串,这两个字符串都来自一个子字符串,每个子字符串都从不允许空值的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>

Screenshot of results

3 个答案:

答案 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

编辑:这很奇怪,我有这张表

enter image description here

并尝试了这个

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

有了这个结果......

enter image description here

我想知道你有哪些列数据类型,我想知道你正在使用的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问题后重写的答案。新答案更好地解释了问题和解决方案。

Example

/* 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