SQL Server - Sp_executesql problema con decimales

 
Vista:

Sp_executesql problema con decimales

Publicado por Ricardo (7 intervenciones) el 28/01/2008 17:19:12
Anexo el procedimiento almacenado donde tengo un problema en todos los insert, ya que no permite insertar valores con decimales, espero me puedan ayudar.
Desde el servidor descargo las actualizaciones para mis catologos.
ejemplo de esta tabla

en el server los valores estan:

margenInf = 0.15
margenSup=14.15
ptsMenos=2.12
version_datos=1

al momento de actualizar mi catologo, en el proceso de insert me los convierte de esta manera:
margenInf = 0
margenSup=14
ptsMenos=2
version_datos=1

-
CREATE PROCEDURE dbo.IActDat_spDescALimitados AS
SET IMPLICIT_TRANSACTIONS Off
SET XACT_ABORT ON

declare @error as smallint
declare @sql nvarchar(4000)
declare @idupdate Nvarchar(4000), @idinsert nvarchar(4000)
declare @Host nvarchar(70)

set @idupdate='0'
set @idinsert='0'

---margenInf, margenSup son primary key por eso estan concatenadas y sus valores son --en decimales

select top 400 @idupdate=@idupdate + ',' + '''' + cast(co.margenInf as Nvarchar) +
cast(co.margenSup as nvarchar) + ''''
from server.db.dbo.DescALimitados co, DescALimitados cs with(nolock)
where co.margenInf=cs.margenInf
and co.margenSup=cs.margenSup
and co.version_datos>cs.version_datos

--print @idupdate
--print len(@idupdate)
select top 400 @idinsert=@idinsert + ',' + '''' + cast(margenInf as Nvarchar) +
cast(margenSup as nvarchar) + ''''
from server.db.dbo.DescALimitados
where margenInf not in (select margenInf from DescALimitados with(nolock))
and margenSup not in (select margenSup from DescALimitados with(nolock))

--print @idinsert
--print len(@idinsert)

IF(@idupdate<>'0' or @idinsert<>'0')
BEGIN

IF exists (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[SEGURIDAD_DescALimitados]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
Alter table db.dbo.DescALimitados disable trigger SEGURIDAD_DescALimitados

set @Host= '##DescALimitados_' + host_name()
IF exists (SELECT * FROM tempdb.dbo.sysobjects WHERE id=object_id(N'tempdb.dbo.##DescALimitados_'+ host_name()))
begin
set @sql='drop table '+@Host+''
exec sp_executesql @sql
end

EXEC IActDat_spcreaTablaSQL 'DescALimitados' --Procedimiento k crea una tabla temporal


/* El problema es que los valores de los campos son en decimal y al momento del insert los guarda pero convertido a enteros, ya he puesto cast y convert como puedo hacer, para insertar los datos tal cual */


set @sql='INSERT '+ @Host +'
(margenInf, margenSup, ptsMenos, version_datos)
SELECT margenInf, margenSup, ptsMenos, version_datos
FROM db.dbo.DescALimitados
WHERE cast(margenInf as nvarchar) +
cast(margenSup as nvarchar) in ('+@idupdate+')'
--print @sql
--print len(@sql)
EXEC @error=sp_executesql @sql

BEGIN DISTRIBUTED TRANSACTION DescALimitados1
set @sql='UPDATE '+ @Host +'
set
ptsMenos = co.ptsMenos,
version_datos = co.version_datos
FROM SERVER.DB.dbo.DescALimitados co, '+ @Host +' cs
WHERE co.margenInf=cs.margenInf
and co.margenSup=cs.margenSup'


EXEC @error=sp_executesql @sql
--print @sql
-- print len(@sql)

IF @ERROR <> 0 goto ERROR1

set @sql='INSERT '+ @Host +'
(margenInf,margenSup,ptsMenos, version_datos)
SELECT convert(decimal,margenInf),margenSup,ptsMenos, version_datos
FROM server.DB.dbo.DescALimitados
WHERE cast(margenInf as nvarchar) +
cast(margenSup as nvarchar) in ('+@idinsert+')'

EXEC @error=sp_executesql @sql

IF @ERROR <> 0 goto ERROR1
--print @sql
--print len(@sql)

COMMIT TRANSACTION DescALimitados1

goto PASO2
ERROR1:
ROLLBACK TRANSACTION DescALimitados1
exec DB.dbo.bitacora_spregistroEventos 2, 'IActDat_spDescALimitados',1, 'Error'
PASO2:

BEGIN DISTRIBUTED TRANSACTION DescALimitados2
--set @Host= '##catproveedores_' + host_name()
set @sql='UPDATE DescALimitados
set
ptsMenos = co.ptsMenos,
version_datos = co.version_datos
FROM ' + @Host + ' co,DescALimitados cs
WHERE co.margenInf=cs.margenInf
and co.margenSup=cs.margenSup'

Exec @error= sp_executesql @sql
--print @sql

IF @error <> 0 goto error2

--print len(@sql)

set @sql='INSERT DescALimitados
(margenInf, margenSup, ptsMenos, version_datos)
SELECT margenInf, margenSup, ptsMenos, version_datos
FROM '+ @Host +'
WHERE cast(margenInf as nvarchar) +
cast(margenSup as nvarchar) in ('+@idinsert+')'

Exec @error=sp_executesql @sql
--print @sql

IF @error <> 0 goto error2

COMMIT TRANSACTION DescALimitados2

GOTO FIN

ERROR2:
ROLLBACK TRANSACTION DescALimitados2
EXEC DB.dbo.Bitacora_spRegistroEventos 2, 'IActDat_spDescALimitados', 1, 'Error'

FIN:
IF exists (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[SEGURIDAD_DescALimitados]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
Alter table db.dbo.DescALimitados enable trigger SEGURIDAD_DescALimitados

END

GO
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder