此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
答案 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
子句中指定要插入的列。这可以帮助其他人以及您自己将来调试您的代码,并轻松消除像您这样的错误。