我有这个查询用于将所有行放在一列中,是动态的,因为我需要使用至少8个表来执行此操作:
DECLARE @tblName VARCHAR(20) = 'Location'
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX)
SELECT @columns = COALESCE(@columns, '') + '+[' + COLUMN_NAME + '],+'''''','''''''
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @tblName and TABLE_SCHEMA='LES'
select @columns
SET @sql = 'SELECT CONCAT(''''''''' + STUFF(@columns, 103,9, '') + '+'''''') FROM ' + @tblName
select @sql
--------------------------------------------------------------------------
R1: SELECT CONCAT(''''+[Location],+''','''+[Location Type],+''','''+[Region],+''','''+[World Region],+''','''+[Refresh Date]+''') FROM Location
如果我执行查询(没有包含NULL值的datetime列(刷新日期)),结果将是
'0020319389','CMF','AJ','AJ'
'0031209263','CMF','AJ','AJ'
'01BM','DCL','EU','EU'
'01CR','DCL','EU','EU'
我的问题是,当我使用Refresh_date
列执行查询时,出现此错误:
从字符串转换日期和/或时间时转换失败。
有人可以帮帮我吗?
由于
答案 0 :(得分:0)
您的问题是,您正在将旧学校连接+
与2012/2014 CONCAT
函数混合,并且数据优先规则已生效。
这段代码使用的是旧式语法
SELECT @columns = COALESCE(@columns, '') + '+[' + COLUMN_NAME + '],+'''''','''''''
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @tblName and TABLE_SCHEMA='LES'
相反,让它使用CONCAT,然后您的数据类型优先级将您的日期时间转换为字符串以及处理NULL。