Como contar palabras en una cadena de SQL Server
|Todos sabemos el poder de SQL Server. Pero, también sabemos que le faltan muchas funciones a SQL Server que aparecen in Excel, Word, y hasta Notepad++. En Excel, Word, y Notepad++, cuando buscamos una palabra, los programas encuentran todas las ocurrencias de las palabras y también cuenta todas las ocurrencias. Pero en SQL Server, cuando buscamos una palabra un una cadena de VARCHAR, NVARCHAR, etc, SQL Server nos da el campo entero. Además, una palabra puede aparecer varias veces en un campo. SQL Server si cuenta las filas regresadas, pero no cuenta las palabras entre el campo.
En este ejemplo, necesito cambiar el RAISERROR 50000 del estilo 2005 al sintaxis RAISERROR(‘’,16,1) de 2008 y adelante. En negocio pido el número de cambios por objeto. Encontré 90% del query en SQL Mag: SQL Server Pro: Counting Instances of a Word in a Record
Pero necesitaba más información, como el tipo de objeto y el nombre del objeto.
SELECT object_name(sm.OBJECT_ID) as NAME
, so.[TYPE]
, SUM((LEN(sm.[definition] ) - LEN(REPLACE(sm.[definition] , 'RAISERROR 50000', '')))/LEN('RAISERROR 50000')) as FOUND
FROM sys.sql_modules as sm
inner join sys.objects as so
on sm.OBJECT_ID = so.OBJECT_ID
where sm.[definition] like '%RAISERROR 50000%'
group by sm.OBJECT_ID, so.[type]
order by object_name(sm.OBJECT_ID)
Los resultados parecen así:
NAME | TYPE | FOUND |
---|---|---|
Trigger_One | TR | 1 |
Proc_001 | P | 3 |
Proc_002 | P | 22 |
Proc_003 | P | 16 |
Que nos da cuantas veces aparece el RAISERROR con la sintaxis de SQL Server 2000.