全部,尝试使此代码正常工作。
这是在另一个存储过程中调用的存储过程的一部分;并将记录从一个表插入另一个表,但我收到此错误
从字符转换日期和/或时间时转换失败 字符串。
** 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
答案 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