2013-11-22 5 views
0

У меня есть простая хранимая процедура, когда целевая таблица и где условия раздела указаны в качестве параметров. «Ошибка арифметического переполнения преобразования NVARCHAR к типу данных числовому.» ошибка вызывает у меня немного разочарования.Как я могу исправить ошибку «Ошибка арифметического переполнения, конвертирующую nvarchar в числовой тип данных». ошибка?

@TableName varchar(50), -- 'A_RECORD_ETH0' test value 

@Time_ms decimal(18,4), -- '40388629085.6481' test value 

@Records int out,  -- should result with '1' if test values are used 

Это работает:

SELECT COUNT(*) as Count FROM A_RECORD_ETH0 WHERE Time_ms = 40388629085.6481 

Это работает:

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM A_RECORD_ETH0 WHERE Time_ms = 40388629085.6481)' 

EXEC sp_executesql @sql, N'@Records int output', @Records output 

Это работает:

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM '+ @TableName + ' WHERE Time_ms = 40388629085.6481)' 

EXEC sp_executesql @sql, N'@Records int output', @Records output 

Это приводит к арифметической ошибки переполнения:

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM '+ @TableName + ' WHERE Time_ms = ' + @Time_ms + ')' 

EXEC sp_executesql @sql, N'@Records int output', @Records output 

Это приводит к арифметической ошибки переполнения даже при использовании литой:

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM '+ @TableName + ' WHERE Time_ms = Cast (' + @Time_ms + ' as decimal(18,4)))' 

EXEC sp_executesql @sql, N'@Records int output', @Records output 

ответ

1

Передача @Time_ms напрямую исключает десятичное преобразование с десятичной последовательностью. Это также более эффективно; когда @Time_ms изменяется, сервер все еще может повторно использовать план выполнения вместо генерации нового.

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM '+ @TableName + ' WHERE Time_ms = @Time_ms' 

EXEC sp_executesql @sql, N'@Time_ms decimal(18,4), @Records int output', @[email protected]_ms, @Records output 
0

я получил следующий работать на основании кода:

DECLARE @sqlSelect nvarchar(500); 
DECLARE @ParmSelect nvarchar(500); 
SET @sqlSelect = N'SET @RecordsOut = (SELECT COUNT(*) FROM ' + @TableName + ' WHERE Time_ms = @Time_msIn)' 
SET @ParmSelect = N'@Time_msIn decimal(18,4), @RecordsOut int OUTPUT'; 
EXEC sp_executesql @sqlSelect, @ParmSelect, @Time_msIn = @Time_ms, @RecordsOut = @Records OUTPUT; 
Смежные вопросы

 Смежные вопросы