【问题标题】:SQL String length limit but return multiple rowsSQL 字符串长度限制但返回多行
【发布时间】:2014-11-06 02:39:20
【问题描述】:

我有一个名为 notes 的表,其中有一列是 nvarchar(MAX),这些列可能有 10 个字符,也可能有 800 个字符。我需要将它分成 250 个字符段。

如果下面的这一行是表中的值,我需要创建 2 行,最多 250 个字符。如果您计算字符,您将拆分单词语音邮件。我需要看到它在一个单词的中间,而不是把它打断。

一揽子留置权已归档,帐户已退还给提供商。呸呸呸会 继续关注并追究留置权支付。叫 Pt Blahat xxx-xxx-xxxx。留下语音信箱。语音邮件问候语没有说明 姓名。在 xxx-xxx-xxxx 呼叫 Pt。留下语音信箱。语音信箱问候语 没有说出名字。

我需要它看起来像这样,但我不知道要这样做。

第 1 行:

一揽子留置权已归档,帐户已退还给提供商。呸呸呸会 继续关注并追究留置权支付。叫 Pt Blahat xxx-xxx-xxxx。留下语音邮件。

第 2 行:

语音邮件问候语没有说明姓名。在 xxx-xxx-xxxx 呼叫 Pt。 留下语音信箱。语音邮件问候语没有说明姓名。

我试过这个,但它会切断单词。

SELECT     Acct, SUBSTRING(Notes, 1, 249) as Note, 'A1' AS  Prefix
FROM         dbo.[RegionalOneNotesResults]
UNION
SELECT     Acct, SUBSTRING(Notes, 250, 249) as Note, 'B2' AS Prefix
FROM          dbo.[RegionalOneNotesResults]

任何帮助将不胜感激

【问题讨论】:

标签: sql string select substring union


【解决方案1】:

这段代码应该做你想做的:

    CREATE PROC WORD_WRAPPED_STRING
          @string VARCHAR(800),
          @length INT

    AS

 SET NOCOUNT ON

 DECLARE  @string_length INT,
          @output        VARCHAR(800),
          @trailing_char CHAR(1),
          @leading_char  CHAR(1)

 IF @length = LEN(@string)
   BEGIN
     PRINT 'please provide a smaller length for dividing the string.'

     RETURN
   END

 IF CHARINDEX(CHAR(13),@string) <> 0
   BEGIN
     SELECT @string = REPLACE(@string,CHAR(10),' ')

     SELECT @string = REPLACE(@String,CHAR(13),)
   END

 SET CONCAT_NULL_YIELDS_NULL OFF

 SELECT @string_length = LEN(@string)

 WHILE @string_length & GT
   ; @length

 BEGIN
   SET @trailing_char = SUBSTRING(LEFT(@string,(@length + 1)),(@length + 1),
                                  1)

   SET @leading_char = SUBSTRING(LEFT(@string,@length),@length,1)

   IF @leading_char = ' '
       OR @trailing_char = ' '
     BEGIN
       SELECT @output = @output + SUBSTRING(@string,1,@length) + CHAR(13)

       SELECT @string = SUBSTRING(@string,(@length + 1),(LEN(@string) - @length + 1))

       SELECT @string_length = LEN(@string)
     END
   ELSE
     -- find the first occurence of a blank space before the trailing space
     BEGIN
       DECLARE  @i INT

       SELECT @i = CHARINDEX(' ',REVERSE(SUBSTRING(@string,1,@length)))

       SELECT @output = @output + SUBSTRING(@string,1,(@length - @i)) + CHAR(13)

       SELECT @string = SUBSTRING(@string,(@length - @i + 2),(LEN(@string) - (@length - @i)))

       SELECT @string_length = LEN(@string)
     END
 END

 SELECT @output = @output + CHAR(13) + @string

 SELECT @output

GO

取自http://www.toadworld.com/platforms/sql-server/w/wiki/10085.word-wrap-a-string.aspx

【讨论】:

  • @Nick 这是一个复杂的问题!您需要做的就是将此代码粘贴到 SQL Server Management Studio 中,运行它以创建存储过程。如果您不确定如何使用存储过程和函数,这里有很多信息......
  • 按照上面的过程,我将如何在查询中使用它。 SELECT Acct, Note, 'A1' AS Prefix FROM dbo.[RegionalOneNotesResults] UNION SELECT Acct, Note, 'B2' AS Prefix FROM dbo.[RegionalOneNotesResults]
  • @NickGiardelli 如果将其更改为 SQL 函数,那么它很容易在 select 语句中使用。
【解决方案2】:

我不明白这个问题。您希望字符串被分割为 250 个字符,但您想要的输出仅被分割为 156

声明@varSample varchar(800);

set @varSample='Blanket Lien Filed,帐户返回给提供者。废话 Blah 将继续跟进并追究留置权付款。叫 Pt Blahat xxx-xxx-xxxx。留下语音信箱。语音邮件问候语没有说明 姓名。在 xxx-xxx-xxxx 呼叫 Pt。留下语音信箱。语音信箱问候语 没有说明名字。';

SELECT SUBSTRING(@varSample, 1, 156) as Note, 'A1' AS  Prefix
UNION SELECT SUBSTRING(@varSample, 157, 300) as Note, 'B1' AS  Prefix

【讨论】:

  • 对不起,复制没有完成,是的,我需要它最多 250 个字符。它看起来像这样,而不是我发布的内容。已提交一揽子留置权,帐户已退还给提供商。 Blah Blah 将继续追随并追究留置权付款。称为 Pt Blahat xxx-xxx-xxxx。留下语音信箱。已提交一揽子留置权,帐户已退还给提供商。 Blah Blah 将继续跟进,最大字符限制很重要,但它不是将一个单词切成两半。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 2018-07-24
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多