2015-10-25 3 views
1

Все, пытаясь заставить этот код работать.Вставка записи из одной таблицы в другую Динамический SQL

Это часть хранимой процедуры, вызванной в другой хранимой процедуре; и вставляет запись из одной таблицы в другую, но я получаю эту ошибку

преобразование не удалось при преобразовании даты и/или времени из символов строки.

** Main Procedure ** 
EXEC [dbo].[usr_INSERTRECORD] ABC, @TableName, @TransDate, @Symbol 

ALTER PROCEDURE [dbo].[usr_INSERTRECORD] 
    -- Add the parameters for the stored procedure here 
    @SourceTable SYSNAME, 
    @TableName SYSNAME, 
    @TransDate Date, 
    @Symbol nvarchar(50) 
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); 
    SET @DATEVARCHAR = CONVERT(NVARCHAR, @TransDate, 103); 
    DECLARE @SQLCommand NVARCHAR(MAX) = 
     N'INSERT INTO ' + QUOTENAME(@TableName) + ' SELECT * FROM ' + + QUOTENAME(@SourceTable) 
     + ' WHERE (TRANSDATE = ' + '''' + @DATEVARCHAR + '''' +') ' + 'AND (SYMBOL = ' + '''' + @SYMBOL + '''' +')'; 

    EXECUTE [dbo].[sp_executesql] 
      @sqlCommand; 
END 

ответ

1

Используйте параметры вместо того, чтобы вставить значения в строке. Вы уже используете sp_executesql, так что это просто использовать его лучше:

DECLARE @SQLCommand NVARCHAR(MAX) = 
    N'INSERT INTO ' + QUOTENAME(@TableName) + ' SELECT * FROM ' + QUOTENAME(@SourceTable) + ' 
     WHERE TRANSDATE = @TransDate AND SYMBOL = @SYMBOL' ; 

EXECUTE [dbo].[sp_executesql] @sqlCommand, 
           N'@TransDate date, @Symbol varchar(50)', 
           @TransDate = @TransDate, @Symbol = @Symbol; 

Кроме того, при использовании VARCHAR() в SQL, всегда включают в себя длину. Длина по умолчанию зависит от контекста, и его исключение - это простой способ сделать ошибку.

Предположительно, причиной вашей ошибки является выполнение сгенерированного кода SQL. Формат 103 - «dd/mm/yyyy», который может или не может вернуться обратно к дате правильно. Если вы действительно хотите представить дату в виде строки, я рекомендую всегда использовать стандартные форматы ISO в формате YYYY-MM-DD или YYYYMMDD.

+0

'WHERE TRANSDATE = @TransDate И SYMBOL = @ SYMBOL' Удалить' ('или добавить закрытие одного – lad2025

0

Это сработало. Спасибо, Гордон. Вот окончательный код

ALTER PROCEDURE [dbo].[usr_INSERTRECORD] 
    -- Add the parameters for the stored procedure here 
    @SourceTable SYSNAME, 
    @TableName SYSNAME, 
    @TransDate Date, 
    @Symbol nvarchar(50) 
    --<@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); 
    SET @DATEVARCHAR = CONVERT(NVARCHAR, @TransDate, 103); 
    DECLARE @SQLCommand NVARCHAR(MAX) = 
     N'INSERT INTO ' + QUOTENAME(@TableName) + ' SELECT * FROM ' + + QUOTENAME(@SourceTable) 
     + ' WHERE (TRANSDATE = @TransDate AND SYMBOL = @SYMBOL)'; 

EXECUTE [dbo].[sp_executesql] @sqlCommand, 
           N'@TransDate date, @Symbol nvarchar(50)', 
           @TransDate = @TransDate, @Symbol = @Symbol; 
END 
Смежные вопросы