2009-11-03 8 views

Respuesta

80

Uso IZQUIERDA combinado con CHARINDEX:

UPDATE MyTable 
SET MyText = LEFT(MyText, CHARINDEX(';', MyText) - 1) 
WHERE CHARINDEX(';', MyText) > 0 

Tenga en cuenta que la cláusula WHERE se salta la actualización de filas en las que no hay punto y coma.

Aquí hay un código para verificar el SQL anterior las obras:

declare @MyTable table ([id] int primary key clustered, MyText varchar(100)) 
insert into @MyTable ([id], MyText) 
select 1, 'some text; some more text' 
union all select 2, 'text again; even more text' 
union all select 3, 'text without a semicolon' 
union all select 4, null -- test NULLs 
union all select 5, '' -- test empty string 
union all select 6, 'test 3 semicolons; second part; third part;' 
union all select 7, ';' -- test semicolon by itself  

UPDATE @MyTable 
SET MyText = LEFT(MyText, CHARINDEX(';', MyText) - 1) 
WHERE CHARINDEX(';', MyText) > 0 

select * from @MyTable 

consigo los siguientes resultados:

id MyText 
-- ------------------------- 
1 some text 
2 text again 
3 text without a semicolon 
4 NULL 
5  (empty string) 
6 test 3 semicolons 
7  (empty string) 
+1

¿Qué pasa si MyText no contiene el ';' ¿personaje? En ese caso, ¿no estaría utilizando un 1 negativo como el segundo parámetro en left(). En ese caso, en mi cuadro, aparece un error de "Parámetro de longitud inválido pasado a la función de subcadena". – Mike

+0

@Mike Ese es exactamente mi problema atm - ¡Vea la siguiente respuesta de @najmeddine! –

+1

@Mike La respuesta de Rashlien a continuación resuelve esto: IZQUIERDA (MyText + ';', CHARINDEX (';', MyText + ';') - 1) – Tim

3

Uso CHARINDEX para encontrar el ";". A continuación, utilice SUBSTRING simplemente devolver la pieza antes de que el ";".

2
UPDATE MyTable 
    SET MyText = SUBSTRING(MyText, 1, CHARINDEX(';', MyText) - 1) 
WHERE CHARINDEX(';', MyText) > 0 
+0

acaba de intentar esto, parece que abandonar el; al final. ;) – Jimmy

16

Para los momentos en que algunos campos tienen un ";" y algunos no se puede también añadir un punto y coma al campo y utilizar el mismo método descrito.

SET MyText = LEFT(MyText+';', CHARINDEX(';',MyText+';')-1) 
8

Podría usar CASE WHEN para dejar los que no tienen ';' solo.

SELECT 
    CASE WHEN CHARINDEX(';', MyText) > 0 THEN 
    LEFT(MyText, CHARINDEX(';', MyText)-1) ELSE 
    MyText END 
    FROM MyTable 
1

Para situaciones en las que tengo que sustituir o partido (encontrar) algo en contra de cadena prefiero el uso de expresiones regulares.

Puesto que, las expresiones regulares no son totalmente compatibles en T-SQL se puede implementar utilizando CLR funciones. Por otra parte, no es necesario ningún conocimiento C# o CLR en absoluto ya que todo lo que necesita ya está disponible en el MSDN String Utility Functions Sample.

En su caso, la solución es el uso de expresiones regulares:

SELECT [dbo].[RegexReplace] ([MyColumn], '(;.*)', '') 
FROM [dbo].[MyTable] 

Pero la implementación de dicha función en su base de datos va a ayudar a resolver los problemas más complejos en absoluto.


El siguiente ejemplo muestra cómo implementar sólo la función [dbo].[RegexReplace], pero voy a recomendar a usted para desplegar toda la clase String Utility.

  1. Habilitación de la integración de CLR. Ejecutar los siguientes comandos de Transact-SQL:

    sp_configure 'clr enabled', 1 
    GO 
    RECONFIGURE 
    GO 
    
  2. Bulding el código (o la creación de la .dll). Generraly, puede hacerlo utilizando el Visual Studio o.El símbolo del sistema de NET Framework (como se muestra en el artículo), pero prefiero usar Visual Studio.

    • crear nuevo proyecto de biblioteca de clases:

      enter image description here

    • copiar y pegar el código siguiente en el archivo Class1.cs:

      using System; 
      using System.IO; 
      using System.Data.SqlTypes; 
      using System.Text.RegularExpressions; 
      using Microsoft.SqlServer.Server; 
      
      public sealed class RegularExpression 
      { 
          public static string Replace(SqlString sqlInput, SqlString sqlPattern, SqlString sqlReplacement) 
          { 
           string input = (sqlInput.IsNull) ? string.Empty : sqlInput.Value; 
           string pattern = (sqlPattern.IsNull) ? string.Empty : sqlPattern.Value; 
           string replacement = (sqlReplacement.IsNull) ? string.Empty : sqlReplacement.Value; 
           return Regex.Replace(input, pattern, replacement); 
          } 
      } 
      
    • construir la solución y obtener la ruta a el archivo creado .dll:

      enter image description here

    • sustituir la ruta al archivo .dll en las siguientes declaraciones T-SQL y ejecutarlos:

      IF OBJECT_ID(N'RegexReplace', N'FS') is not null 
      DROP Function RegexReplace; 
      GO 
      
      IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'StringUtils') 
      DROP ASSEMBLY StringUtils; 
      GO 
      
      DECLARE @SamplePath nvarchar(1024) 
      -- You will need to modify the value of the this variable if you have installed the sample someplace other than the default location. 
      Set @SamplePath = 'C:\Users\gotqn\Desktop\StringUtils\StringUtils\StringUtils\bin\Debug\' 
      CREATE ASSEMBLY [StringUtils] 
      FROM @SamplePath + 'StringUtils.dll' 
      WITH permission_set = Safe; 
      GO 
      
      
      CREATE FUNCTION [RegexReplace] (@input nvarchar(max), @pattern nvarchar(max), @replacement nvarchar(max)) 
      RETURNS nvarchar(max) 
      AS EXTERNAL NAME [StringUtils].[RegularExpression].[Replace] 
      GO 
      
    • Eso es todo. Pruebe su función:

      declare @MyTable table ([id] int primary key clustered, MyText varchar(100)) 
      insert into @MyTable ([id], MyText) 
      select 1, 'some text; some more text' 
      union all select 2, 'text again; even more text' 
      union all select 3, 'text without a semicolon' 
      union all select 4, null -- test NULLs 
      union all select 5, '' -- test empty string 
      union all select 6, 'test 3 semicolons; second part; third part' 
      union all select 7, ';' -- test semicolon by itself  
      
      SELECT [dbo].[RegexReplace] ([MyText], '(;.*)', '') 
      FROM @MyTable 
      
      select * from @MyTable 
      
Cuestiones relacionadas