Acho que estou perto, mas os apóstrofos estão me matando:
create procedure denull (@database varchar(255), @table varchar(255))
as
declare @sql nvarchar(max)
set @sql = ' declare @name varchar(255), @column varchar(255))
declare c cursor local for
select st.name, sc.name from ' + @database + '.sys.tables st
inner join sys.columns sc on st.object_id = sc.object_id
where st.name = ''' + @table + '''
update ''''@name'''' set ''''@column'''' = '''' where ''''@column is null''
fetch next from st.name, sc.name
close c
deallocate c
'
print @sql
exec sp_executesql @sql
ele imprime para:
declare @name varchar(255), @column varchar(255))
declare c cursor local for
select st.name, sc.name from livendbmirror.sys.tables st
inner join sys.columns sc on st.object_id = sc.object_id
where st.name = 'CMS_27_Psych_results'
update ''@name'' set ''@column'' = '' where ''@column is null'
fetch next from st.name, sc.name
close c
deallocate c
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ')'.
Msg 102, Level 15, State 1, Line 9
Incorrect syntax near ''.
Msg 105, Level 15, State 1, Line 9
Unclosed quotation mark after the character string '
fetch next from st.name, sc.name
close c
deallocate c
'.
Pergunta: Como posso remover dinamicamente valores nulos e substituí-los por '' para usuários finais exigentes?
Eu pensaria duas vezes antes de modificar os dados com carta branca da maneira que você está propondo, a menos que você esteja fazendo isso uma vez como parte de um esforço de pureza de dados.
Eu escreveria o código para fazer a modificação usando primeiro o T-SQL não dinâmico, depois o converteria em T-SQL dinâmico e, finalmente, o adicionaria a um procedimento armazenado para fácil reutilização.
Por exemplo, criaremos uma tabela em tempdb e atualizaremos uma coluna que tenha valores nulos:
Em seguida, adicionaremos este código a uma estrutura que usa T-SQL dinâmico para que não precisemos escrever instruções individuais para cada coluna que desejamos atualizar:
Ele usa um cursor para iterar sobre todas as colunas varchar, nvarchar, char e nchar na tabela em que o valor da coluna é nulo.
Em seguida, criaremos um procedimento armazenado para executar o código. O proc armazenado tem um parâmetro,
@debug
, que nos permite ver aUPDATE
instrução ou realmente executar aUPDATE
instrução.Execute o procedimento armazenado como este, que na verdade não modificará os dados, pois deixamos o
@debug
parâmetro definido com seu valor padrão.:Se quisermos realmente modificar os dados, execute o procedimento armazenado assim:
Uau, se você fizer isso com o assistente de exportação de importação sql, ele apenas lida com isso para você.
Eu ainda vou fazer este SP funcionar, no entanto. Pela ciência.