webForumDet fria alternativet

Uppdatera tabel vars numeriska kolumner innehåller null

3 svar · 346 visningar · startad av Engine^

Engine^Medlem sedan dec. 20003 887 inlägg
#1

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
#2

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
#3

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
#4

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
135 ms totalt · 3 externa anrop · v20260731065814-full.2ca38e60
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)