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

将记录从一个表插入另一个动态SQL,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,所有这些都是为了让这段代码正常工作 这是在另一个存储过程中调用的存储过程的一部分;并将记录从一个表插入到另一个表中,但我得到了这个错误 从字符转换日期和/或时间时转换失败 绳子 使用参数,而不是在字符串中插入值。您已经在使用sp_executesql,因此这只是在更好地使用它: DECLARE @SQLCommand NVARCHAR(MAX) = N'INSERT INTO ' + QUOTENAME(@TableName) + ' SELECT * FROM ' + QUOTENA

所有这些都是为了让这段代码正常工作

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

从字符转换日期和/或时间时转换失败 绳子


使用参数,而不是在字符串中插入值。您已经在使用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标准格式。

。谢谢你,戈登。这是最后的代码

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
其中TRANSDATE=@TRANSDATE和SYMBOL=@SYMBOL删除或添加结束日期
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