Engine^Medlem sedan dec. 20003 887 inlägg Jag skulle behöva en trevlig liten sp eller liknande för att inte manuellt behöva sätta alla null-värden till -1 i de kolumner i tabellen som är numeriska.
Jag hade tänkt att välja ut dessa kolumner ur schema-tabellen och sedan helt enkelt loopa igenom kolumnerna och uppdatera alla null till -1.
Jag har inte hittat någon vettig hjälp för att skriva ihop en sp för att göra detta, så om någon skulle kunna hjälpa mig här vore jag tacksam :)
LarsGMedlem sedan dec. 200012 464 inlägg Ge mig en god anledning till att du vill göra detta för alla numeriska kolumner och alla tabeller. Jag kan ha viss förståelse för att man eventuellt skulle kunna tänka sig att vid speciella omständigheter göra detta för en specifik kolumn i en specifik tabell men längre än så kan jag näppeligen sträcka mig.
begin
declare @a cursor for
select column_name , table_name,table_schema
from information_schema.columns
where table_schema in (<schemas>)
and data_type in (<numeric datatypes>)
declare @q nvarchar(400)
declare @s sysname, @t sysname, @c sysname
open @a
fetch @a into @s,@t,@c
while (@@fetch_status <> 1)
begin
@q = 'update ' + @s + '.' + @t +
' set ' + @c + ' = -1 ' +
' where ' + @c + ' is null'
--
-- initialt under testfas kan man byta ut exec mot print
--
exec(@q)
fetch @a into @s,@t,@c
end
close @a
end
Detta är ju helt otestat så du får titta på detaljer angående fetch och @@fetch_status (eller något liknande) och sysname (eller något liknande). Om du har namn med konstiga tecken eller som är reserverade ord så behövs specialhantering för detta.
Engine^Medlem sedan dec. 20003 887 inlägg Det är endast i en tabell jag har ett behov av att göra det här och det är en tabell som innehåller svar som sedan används för att beräkna statistik.
Anledningen är att en count(*) för -1 blir knas om det råkar vara massa null här och var, som ska vara -1 och inget annat. Det är en omdesign av denna tabell som orsakat det här bekymret.
Tusen tack dock, LarsG.
Engine^Medlem sedan dec. 20003 887 inlägg Efter några smärre förändringar så gör den precis vad jag vill. Tänkte att jag kan visa smacket om någon annan är intresserad.
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER procedure [dbo].[spRemoveNullValues]
@tablename varchar(32)
as
declare @cname sysname
declare @tname sysname
declare @sname sysname
declare cur cursor read_only for
select column_name, table_schema
from information_schema.columns
where table_name = @tablename and data_type in ('int', 'float') and column_name not in ( 'id', 'weight' )
open cur
fetch from cur into @cname, @sname
while (@@fetch_status = 0)
begin
declare @sql nvarchar(512)
set @sql = 'update ' + @sname + '.' + @tablename +
' set ' + @cname + ' = -1 ' +
' where ' + @cname + ' is null'
exec(@sql)
print @sql
fetch from cur into @cname, @sname
end
close cur
deallocate cur
go