Eliminare tutti i campi NULL da una tabella e relativa stored procedure

di il
6 risposte

Eliminare tutti i campi NULL da una tabella e relativa stored procedure

Buongiorno a tutti,
dato che questo è il mio primo post, mi presento:
sono Keith, lavoro in una media azienda e da un paio di mesi sono stato catapultato al CED a sviluppare applicazioni. Purtroppo SQL è un argomento a cui non mi ero mai interessato fino a quel momento.
Detto questo, ho un quesito per voi:

ho creato una query per eliminare tutti i campi NULL da una tabella
DECLARE @nomeTabella nvarchar(100) = ' INSERIRE NOME TABELLA '
            DECLARE @nome varchar(50)
            DECLARE @tipo varchar(50) 
            DECLARE @CMD NVARCHAR (200) 
            DECLARE db_cursor CURSOR FOR 
                  SELECT c.name, t.name AS Dtype 
                  FROM sys.columns c 
                  INNER JOIN sys.types t 
                  ON t.system_type_id = c.system_type_id 
                  WHERE c.[object_id] = 
                      (SELECT [object_id] FROM sys.objects WHERE type = 'U' AND [name] = @nomeTabella) 
            OPEN db_cursor 
            FETCH NEXT FROM db_cursor INTO @nome, @tipo 
            WHILE @@FETCH_STATUS = 0 BEGIN
            SET @CMD = 'UPDATE ' + @nomeTabella + ' SET ' + quotename(@nome) +' = ' + 
               (CASE 
                 WHEN (@tipo = 'bit') THEN '0' 
                 WHEN (@tipo = 'int') THEN '0' 
                 WHEN (@tipo = 'decimal') THEN '0' 
                 WHEN (@tipo = 'date') THEN '''1/1/1900''' 
                 WHEN (@tipo = 'datetime') THEN '''1/1/1900'''
                 WHEN (@tipo = 'uniqueidentifier') THEN '00000000-0000-0000-0000-000000000000' 
              ELSE '''''' 
              END ) 
            + ' WHERE ' + quotename(@nome) + ' IS NULL' 
            PRINT @CMD 
            EXEC sp_executeSQL @cmd 
            FETCH NEXT FROM db_cursor INTO @nome, @tipo 
            END 
            CLOSE db_cursor 
            DEALLOCATE db_cursor
Fatta la query, faccio la stored procedure:
ALTER PROCEDURE [dbo].[sp_PulisciNull] 
@nomeTabella nvarchar(100) 
AS
BEGIN
	SET NOCOUNT ON;

	DECLARE @TSQL varchar(max)
    SELECT  @TSQL = '
	USE [Logika]            
            DECLARE @nomeTabella varchar(50) = '' + @nomeTabella + ''
			DECLARE @nome varchar(50)
            DECLARE @Tipo varchar(50) 
            DECLARE @CMD NVARCHAR (200) 
            DECLARE db_cursor CURSOR FOR 
                  SELECT c.name, t.name AS Dtype 
                  FROM sys.columns c 
                  INNER JOIN sys.types t 
                  ON t.system_type_id = c.system_type_id 
                  WHERE c.[object_id] = 
                      (SELECT [object_id] FROM sys.objects WHERE type = ''U'' AND [name] = @nomeTabella) 

            OPEN db_cursor 
            FETCH NEXT FROM db_cursor INTO @nome, @Tipo 

            WHILE @@FETCH_STATUS = 0 BEGIN

            SET @CMD = ''UPDATE '' + @nomeTabella + '' SET '' + quotename(@nome) + '' = '' + 

               (CASE 
                 WHEN (@Tipo = ''bit'') THEN ''0'' 
                 WHEN (@Tipo = ''int'') THEN ''0'' 
                 WHEN (@Tipo = ''decimal'') THEN ''0'' 
                 WHEN (@Tipo = ''date'') THEN ''1/1/1900'' 
                 WHEN (@Tipo = ''datetime'') THEN ''1/1/1900''
                 WHEN (@Tipo = ''uniqueidentifier'') THEN 
				 ''00000000-0000-0000-0000-000000000000''
              ELSE
			  ''''
              END ) 
            + '' WHERE '' + quotename(@nome) +'' IS NULL''

            --PRINT @CMD 

            EXEC sp_executeSQL @cmd 

            FETCH NEXT FROM db_cursor INTO @nome, @Tipo 

            END 

            CLOSE db_cursor 
            DEALLOCATE db_cursor '''
    EXEC (@TSQL)
	
END
In esecuzione ottengo questo:
Messaggio 105, livello 15, stato 1, riga 46
Virgoletta di chiusura mancante dopo la stringa di caratteri ''.

(Righe interessate: 1)
Le ho provate tutte per trovare la giusta combinazione di apici, qualcuno ha una dritta?

6 Risposte

  • Re: Eliminare tutti i campi NULL da una tabella e relativa stored procedure

    Spiega il significato che dai alla frase:

    Eliminare tutti i campi NULL

    perché detta così, francamente, non è per nulla comprensible.
  • Re: Eliminare tutti i campi NULL da una tabella e relativa stored procedure

    gibra ha scritto:


    Spiega il significato che dai alla frase:

    Eliminare tutti i campi NULL

    perché detta così, francamente, non è per nulla comprensible.
    .
    .
    .
    SET @CMD = 'UPDATE ' + @nomeTabella + ' SET ' + quotename(@nome) +' = ' +
    (CASE
    WHEN (@tipo = 'bit') THEN '0'
    WHEN (@tipo = 'int') THEN '0'
    WHEN (@tipo = 'decimal') THEN '0'
    WHEN (@tipo = 'date') THEN '''1/1/1900'''
    WHEN (@tipo = 'datetime') THEN '''1/1/1900'''
    WHEN (@tipo = 'uniqueidentifier') THEN '00000000-0000-0000-0000-000000000000'
    ELSE ''''''
    END )
    + ' WHERE ' + quotename(@nome) + ' IS NULL'
    .
    .
    .
    SOSTITUIRE tutti i campi NULL con altri valori in base al tipo di dato impostato per il campo.
    La query funziona egreggiamente, la sp no.
  • Re: Eliminare tutti i campi NULL da una tabella e relativa stored procedure

    Allora non devi eliminarei campi NULL, ma:

    aggiornare tutti i campi che hanno il valore a NULL e sostituirli con altri valori.

    L'errore che rcevi è:
    Messaggio 105, livello 15, stato 1, riga 46
    Virgoletta di chiusura mancante dopo la stringa di caratteri ''.

    (Righe interessate: 1)
    La riga 46 che genera l'errore qual'è?

  • Re: Eliminare tutti i campi NULL da una tabella e relativa stored procedure

    gibra ha scritto:



    La riga 46 che genera l'errore qual'è?

    Mi piacerebbe saperlo, quando eseguo la sp, non vedo la query che viene generata (o almeno, grazie alla mia nabbosità, non so come si fa).
    In teoria, la query dovrebbe avere 43 righe, quindi non ne ho idea.
  • Re: Eliminare tutti i campi NULL da una tabella e relativa stored procedure

    Non l'ai provata nel SSMS ?
  • Re: Eliminare tutti i campi NULL da una tabella e relativa stored procedure

    Ciao,
    vedo che componi la query come stringa per farla poi eseguire (immagino) con:
    EXEC (@CMD)

    L'errore sta già nella composizione della stringa.. leggo ad esempio:
    SET @CMD = 'UPDATE ' + @nomeTabella + ' SET ' + quotename(@nome) +' = ' +
    (CASE 
    mentre dovresti scrivere:
    SET @CMD = 'UPDATE ' + @nomeTabella + ' SET ' + quotename(@nome) +' = ' +
    ' (CASE 
    e così via
Devi accedere o registrarti per scrivere nel forum
6 risposte