从字符串转换日期和/或时间时,GETDATE()消息241转换失败

时间:2018-07-02 08:42:50

标签: sql-server

此SQL语句在我的一台服务器上引发转换错误:

DECLARE @TimeStamp datetime;
SET @TimeStamp = GETDATE();

INSERT INTO Lookups 
    SELECT 
        newid() AS Id, 
        'Type' AS Type, Name, 
        'A.Miller' AS CreatedName, 
        'A.Miller' AS ChangedName,
        @TimeStamp AS CreatedDate, 
        @TimeStamp AS ChangedDate 
    FROM 
        [DBServer].[Database].[dbo].[LkValues] 
    WHERE 
        NOT Name IS NULL OR Name = ''

错误:

  

信息241,级别16,状态1,第5行
  从字符串转换日期和/或时间时转换失败。

我也尝试了几种变体,但是没有一个要转换的变量是我们的格式,没有转换就没有成功:

CONVERT(datetime, GETDATE(), 110) AS CreatedDate, 
CONVERT(datetime, GETDATE(), 110) AS ChangedDate 

没有SELECT的{​​{1}}语句产生的值看起来都很好。

我正在SQL Server 2008 R2(v10.50.2550.0)上运行它。

在另一台服务器上运行该命令没有任何问题,为什么?

表DDL:

INSERT

1 个答案:

答案 0 :(得分:4)

这在目前是一个很大的猜测,但是,我会猜测,这些列的顺序与SELECT语句中的顺序不同。另外,无需将GETDATE()的值分配给变量,只需在SELECT中声明它即可。

假设,您所使用的别名是表[DBServer].[Database].[dbo].[LkValues]中列的名称,那么这应该起作用:

INSERT INTO Lookups (Id, [Type],[Name],CreatedName,ChangedName,CreatedDate,ChangedDate)
SELECT newid(), 
    'Type',
    [Name], 
    'A.Miller', 
    'A.Miller',
    GETDATE(),GETDATE()
FROM [DBServer].[Database].[dbo].[LkValues]
WHERE NOT [Name][] IS NULL OR [Name] = '';

编辑:我的猜测是正确的。当插入表时,别名没有任何意义。您提供的是列的顺序,而不是列的名称。例如:

CREATE TABLE #sample (column1 int, column2 int);

INSERT INTO #sample 
--inserts into the "wrong" columns
SELECT 2 AS column2, 1 AS column1;

SELECT *
FROM #sample;

INSERT INTO #sample (column2,
                     column1)
--Inserts into the wanted columns, as they are specified
SELECT 2, 1;

INSERT INTO #sample
--Inserts into the wanted columns, as they are in the same order as the table
SELECT 3 AS Column1, 4 AS Column2;

SELECT *
FROM #sample;

DROP TABLE #sample;

使用INSERT语句时,最好在INSERT子句中指定要插入的列。这可以帮助其他人以及您自己将来调试您的代码,并轻松消除像您这样的错误。