Estoy trabajando en un procedimiento almacenado que se acepte una cadena y devuelve una nueva cadena de texto. Los parámetros de entrada son @OrderId y @OrderText que es una cadena con el signo de dólar cerrado variables como así… $Order Name$ sent to $Customer$

Las variables válidas están en un Variables (tabla de valores tales como el Nombre de Orden, el Cliente, un total de 25 en la que debe permanecer relativamente estática). Las Variables pueden ser utilizados una sola vez en la cadena.

El procedimiento almacenado que se necesita para volver a la cadena pero con las variables reemplazado con sus respectivos valores.

Ejemplo1

De entrada: 123, $Order Name$ sent to $Customer$

Devuelve: Toolkit sent to StackCustomer Inc.

Ejemplo2

De entrada: 456, $Customer$ requests $delivery method$ for $order type$

Devuelve: ABC Inc requests fast shipping for pallet orders.

Cada una de las variables puede ser recuperada mediante una función.

    DECLARE @OrderId int = 123
    DECLARE @InputText VARCHAR(500) = '$Order Name$ sent to $Customer$'
    select 
     @InputText = case when @InputText like '%$order name$%' 
             then replace(@InputText, '$Order Name$', getOrderName(id) else '' end,
     @InputText = case when @InputText like '%$customer$' 
             then replace(@InputText, '$Customer$', getCustomer(id) else '' end
      -- repeat 25 times

Hay una manera mejor? Mi preocupación principal es la facilidad de mantenimiento – si una variable se agrega, cambiado de nombre o eliminado, este procedimiento almacenado se necesita ser cambiado (aunque me dijeron que sólo pasaría un par de veces al año, si eso). Sería de sql dinámico, ser capaz de ayudar en este caso?

  • Exactamente qué está haciendo usted en las funciones? Tal vez publicar una muestra de ese código. Además, es la cadena de entrada el formato siempre es el mismo o tiene control sobre el formato de este así?
  • Desde TSQL es un pobre lenguaje para la manipulación de texto en general, creo que una mejor manera sería hacer esto en una aplicación con una de las plantillas de conjunto de herramientas de algún tipo.
  • no hay control sobre el formato de la cadena de entrada.
InformationsquelleAutor Gabe | 2013-04-05

2 Comentarios

  1. 3

    Personalmente, me gustaría crear una tabla de palabras clave para mantener la. algo como esto

    CREATE TABLE [keywords] (
      key_value VARCHAR(100) NOT NULL,
      function_value VARCHAR(100) NOT NULL
      )
    INSERT INTO [keywords]
    VALUES
    ('$Customer$','getCustomer(id)'),
    ('$Order Name$' ,'getOrderName(id)'),
    ('$order type$','getOrderType(id)')

    A continuación, utilizar sql dinámico crear REEMPLAZAR SQL

    DECLARE @OrderId int = 123
    DECLARE @InputText VARCHAR(500) = '$Order Name$ sent to $Customer$'
    
    DECLARE @sql VARCHAR(8000) = 'SELECT '
    
    SELECT 
      @sql = @sql + 
      ' @InputText = replace(@InputText, ''' + key_value + ''', ' + function_value + ')'
        + ' ,'
    FROM keywords
    WHERE  @InputText LIKE '%' + key_value + '%'
    
    
    SELECT @sql = LEFT(@sql, LEN(@sql) -1)
    PRINT @sql
    
    EXEC(@sql)

    SQLFiddle

    • Acaba de probar este. Me gusta mucho! Creo que esto va a funcionar.
  2. 0

    Yo no soy realmente el por qué usted necesita para hacer la segmentación si usted va a utilizar las variables de entrada para el procedimiento.

    Hay token de plantillas que ya están disponibles para SQL Management Studio, en la forma de:

    <(tokenName),(datatype),(defaultvalue)>

    Que usted puede conseguir sus datos se introducen directamente con SQL Managment Studio con CTRL + SHIFT + M, o con ALT > P > S en 2012, o por el texto de la búsqueda de sus valores en un entorno.

    Si usted está tratando de poner en una entrada que se accede por un fuera de el desarrollo de la plataforma que los cambios de las cadenas como ADO.NET o en el Marco de la Entidad en C#/VB.NETA yo todavía no estoy recibiendo por qué no iba a hacer más justo variables de entrada.

    Usted puede hacer esto con bastante facilidad:

    Declare @OrderPlace varchar(128), @Customer varchar(64), @StringCombine varchar(512);
    
    Select 
       @OrderPlace = 'Place I am at'
    ,  @Customer = 'Mr Customer';
    
    Select @StringCombine = @Customer + ' order at ' + @OrderPlace

    Entonces, si un idioma diferente a su procedimiento de SQL server sólo tiene que poner en dos parámetros @Cliente y @OrderPlace. Usted puede incluso fijar @StringCombine a ser una variable de salida. Esto es mucho más preferible, a continuación, el texto de sustitución de caracteres y, a continuación, ejecuta una cadena. Esto podría ser capaz de ataques de inyección de SQL potencialmente tan santizing sus entradas es de una gran parte de la devolución de los datos, especialmente si están alterando algo para SQL a ejecutar antes de que se corrió.

    Que usted ha mencionado la capacidad de mantenimiento y esto es mucho más sólida, porque si tengo que cambiar la lógica para el proceso, pero NO se cambian los nombres de las variables, no tuve que cambiar nada más. Si tengo que cambiar un ADO.NET o de la biblioteca de referencias y, a continuación, el código SQL, que es mucho más trabajo. Generalmente cuando se trabaja con fichas que se esfuerzan para la reutilización de código, donde una parte de ella puede ir hacia abajo y sólo duele que una parte de él, no tome la cosa entera hacia abajo.

Dejar respuesta

Please enter your comment!
Please enter your name here