tin*_*han 2 sql t-sql sql-server
我正在努力解决这个返回错误的查询:从字符串转换日期和/或时间时转换失败.
从我的谷歌搜索来看,这是一个常见的错误,但到目前为止我没有尝试过.我已经尝试将@startdate转换为datetime和varchar而不管它,如下例所示.
我也尝试使用convert对fieldname和参数名称,虽然不可否认,我可能只是得到了错误的语法.
ALTER PROCEDURE [dbo].[customFormReport]
(
@formid int,
@startdate DATETIME
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(fieldname) from FormResponse WHERE FormID = @formid AND value IS NOT NULL FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT FormID, FormSubmissionID,' + @cols + ' from
(
SELECT FormID, FormSubmissionID, fieldname, value
FROM FormResponse WHERE FormID = ' + CAST(@formid AS VARCHAR(25)) + ' AND createDate > ' + @startdate + '
) x
pivot
(
max(value)
for fieldname in (' + @cols + ')
) p '
execute(@query)
Run Code Online (Sandbox Code Playgroud)
编辑:查询工作,除非我添加导致错误的位:
' AND createDate > ' + @startdate + '
Run Code Online (Sandbox Code Playgroud)
问题是您正在尝试将a连接datetime到您的varcharsql字符串.你需要转换它:
convert(varchar(10), @startdate, 120)
Run Code Online (Sandbox Code Playgroud)
所以完整的代码将是:
ALTER PROCEDURE [dbo].[customFormReport]
(
@formid int,
@startdate DATETIME
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(fieldname) from FormResponse WHERE FormID = @formid AND value IS NOT NULL FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT FormID, FormSubmissionID,' + @cols + ' from
(
SELECT FormID, FormSubmissionID, fieldname, value
FROM FormResponse
WHERE FormID = ' + CAST(@formid AS VARCHAR(25)) + '
AND createDate > ''' + convert(varchar(10), @startdate, 120) + '''
) x
pivot
(
max(value)
for fieldname in (' + @cols + ')
) p '
execute(@query)
Run Code Online (Sandbox Code Playgroud)