将记录从一个表插入另一个动态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