2015-11-21 3 views
0

Я бегу хранимую процедуру, которая вызывает эту хранимую процедуру для обновления записей в таблице на основе параметров, переданных, но я получаю следующее сообщение об ошибке.Процедура динамического SQL Server Update дает ошибку Invalid столбец

Msg 207, Level 16, State 1,
Line 1 Invalid column name '1.24483e+007'.

Msg 207, Level 16, State 1,
Line 1 Invalid column name '1.24101e+007'.

Не могу понять, что я пропустил здесь?

Код:

ALTER PROCEDURE [dbo].[usr_UPDATEMEANSTDEV] 
    @TableName Sysname, 
    @Symbol NVARCHAR(50), 
    @MeanLTD float, 
    @StdevLTD float, 
    @MaxLTD float, 
    @MeanYTD float, 
    @StdevYTD float, 
    @MaxYTD float 
    --<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0> 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @SQLCommand NVARCHAR(MAX) = 
     N'UPDATE ' + QUOTENAME(@TableName) + 
     ' SET LTD_MEAN = ' + QUOTENAME(@MeanLTD) + 
     ',YTD_MEAN = ' + QUOTENAME(@MeanYTD) + 
     ',LTD_MAX = ' + QUOTENAME(@MaxLTD) + 
     ',YTD_MAX = ' + QUOTENAME(@MaxYTD) + 
     ',LTD_STDEV = ' + QUOTENAME(@StdevLTD) + 
     ',YTD_STDEV = ' + QUOTENAME(@StdevYTD) + 
     + ' WHERE (SYMBOL = @SYMBOL)'; 

    EXECUTE [dbo].[sp_executesql] @sqlCommand, 
        N'@Symbol nvarchar(50)', @Symbol = @Symbol; 
END 
+2

Вы должны использовать 'QUOTENAME' для значений? Разве это не цитирует параметр, который будет использоваться как имя (например, имя таблицы или столбца)? – Kenney

+0

Просьба указать определение функции QUOTENAME, а также образец ввода, который дает вашу ошибку. – LDMJoe

+0

Вы можете распечатать запрос внутри @sqlCommand и разместить здесь? –

ответ

0

Проблема в том, что вы подведение своих значений в квадратных скобках, что не является правильным, и ваши номера поплавковых threated в виде столбцов (ну, любой объект в БД) и конечно, их там не существует. Это должно быть правильным:

ALTER PROCEDURE [dbo].[usr_UPDATEMEANSTDEV] 
    -- Add the parameters for the stored procedure here 
    @TableName Sysname, 
    @Symbol NVARCHAR(50), 
    @MeanLTD FLOAT, 
    @StdevLTD FLOAT, 
    @MaxLTD FLOAT, 
    @MeanYTD FLOAT, 
    @StdevYTD FLOAT, 
    @MaxYTD FLOAT 
    --<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0> 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    -- DECLARE @DATEVARCHAR NVARCHAR(4000); 
    DECLARE @SQLCommand NVARCHAR(MAX) = N' 
     UPDATE ' + QUOTENAME(@TableName) + N' 
     SET LTD_MEAN = @MeanLTD 
      , YTD_MEAN = @MeanYTD 
      , LTD_MAX = @MaxLTD 
      , YTD_MAX = @MaxYTD 
      , LTD_STDEV = @StdevLTD 
      , YTD_STDEV = @StdevYTD 
     WHERE SYMBOL = @SYMBOL'; 

    EXECUTE dbo.sp_executesql @sqlCommand 
     , N '@Symbol NVARCHAR(50), @MeanLTD FLOAT, @StdevLTD FLOAT, @MaxLTD FLOAT, @MeanYTD FLOAT, @StdevYTD FLOAT, @MaxYTD FLOAT' 
     , @Symbol 
     , @MeanLTD 
     , @StdevLTD 
     , @MaxLTD 
     , @MeanYTD 
     , @StdevYTD 
     , @MaxYTD; 
END 
+0

Я думаю, что другие значения параметров должны быть назначены аналогично @Symbol. –

+0

Не обязательно. Их следует подбирать по порядку, что определено в объявлении параметров. –

+0

Да, это должно быть. 'Необходимо передать параметр номер 4 и последующие параметры как '@name = value'. После того, как в форме «@name = значение» используется, все последующие параметры должны быть переданы в виде «@name = value'.' –

0

Удалить QUOTENAME functon. Вы не можете использовать его значения обложки. Предполагается избежать reserved keywords , symbols and space в любом sql objects.

Теперь значения будут считаться Column names в заявке update, так как это связано с square brackets, что является причиной ошибки. Пример [1.2] будет проанализирован в качестве колонки, присутствующей в таблице VNASAAIT

DECLARE @SQLCommand NVARCHAR(MAX) = 
     N'UPDATE ' + QUOTENAME(@TableName) + 
     ' SET LTD_MEAN = ' + cast(@MeanLTD as varchar(50)) + 
     ',YTD_MEAN = ' + cast(@MeanYTD as varchar(50)) + 
     ',LTD_MAX = ' + cast(@MaxLTD as varchar(50)) + 
     ',YTD_MAX = ' + cast(@MaxYTD as varchar(50)) + 
     ',LTD_STDEV = ' + cast(@StdevLTD as varchar(50)) + 
     ',YTD_STDEV = ' + cast(@StdevYTD as varchar(50)) + 
     + ' WHERE (SYMBOL = @SYMBOL)'; 
+0

Это не сработает. Вы должны получить ошибку, которую nvarchar не может преобразовать в float. –

+0

@EvaldasBuinauskas - Я пропустил его –

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