将记录从一个表插入另一个动态SQL

时间:2015-10-25 13:47:59

标签: sql sql-server tsql stored-procedures

全部,尝试使此代码正常工作。

这是在另一个存储过程中调用的存储过程的一部分;并将记录从一个表插入另一个表,但我收到此错误

  

从字符转换日期和/或时间时转换失败   字符串。

** 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

2 个答案:

答案 0 :(得分: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;

此外,在SQL中使用VARCHAR()时,始终包含长度。默认长度取决于上下文,将其遗漏是一种容易出错的方法。

据推测,错误的原因在于执行生成的SQL代码。格式103是“dd / mm / yyyy”,其可以或可以不正确地转换回日期。如果您真的想将日期表示为字符串,我建议您始终使用YYYY-MM-DD或YYYYMMDD的ISO标准格式。

答案 1 :(得分: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