我想写一个SQL Server存储过程从该查询存储过程误差转换的SQL Server
ALTER procedure [dbo].[sp_get_list_penerimaan_pks]
(@tahun int,
@bulan int,
@pks int)
as
begin
SET NOCOUNT ON;
declare @cols AS NVARCHAR(MAX);
declare @query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.asal)
FROM (
SELECT
cpo.tanggal,
dg.asal,
(((((cpo - ongkos_ms)* CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))) +((pko - ongkos_is)* CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))))-(447.6 * ((CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0)))+(CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))))))-(((((cpo - ongkos_ms)* CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))) +((pko - ongkos_is)* CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))))-(447.6 * ((CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0)))+(CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0)))))) * 0.02))
as harga_beli_tbs_bersih
FROM
cpopko cpo
LEFT JOIN DAILY_GUU AS dg ON CONVERT (datetime, dg.tglolah, 103) = cpo.tanggal
LEFT JOIN PNL_TR_HARGA_KOMODITI AS ko ON ko.tanggal = cpo.tanggal
WHERE
YEAR (cpo.tanggal) >= @tahun and [email protected] and month(cpo.tanggal)[email protected]
) c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT tanggal, ' + @cols + ' from
(
SELECT
cpo.tanggal,
dg.asal,
(((((cpo - ongkos_ms)* CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))) +((pko - ongkos_is)* CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))))-(447.6 * ((CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0)))+(CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))))))-(((((cpo - ongkos_ms)* CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))) +((pko - ongkos_is)* CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))))-(447.6 * ((CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0)))+(CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0)))))) * 0.02))
as harga_beli_tbs_bersih
FROM
cpopko cpo
LEFT JOIN DAILY_GUU AS dg ON CONVERT (datetime, dg.tglolah, 103) = cpo.tanggal
LEFT JOIN PNL_TR_HARGA_KOMODITI AS ko ON ko.tanggal = cpo.tanggal
WHERE
YEAR (cpo.tanggal) >= '[email protected] +' and [email protected] and month(cpo.tanggal)[email protected]
) x
pivot
(
max(harga_beli_tbs_bersih)
for asal in (' + @cols + ')
) p '
execute(@query)
end
检索转动的结果,但我得到这个错误结果:
程序执行失败22018 - 当转换nvarchar值'SELECT tanggal,[54],[11],[56],[53],[40],[21] [12]时,[0121]唐加尔, dg.asal,(((cpo-ongkos_ms)* CAST(NULLIF(dg.minyak_efektif,0)as float)/(NULLIF(dg.tbs_diolah,0)))+((pko-ongkos_is)* CAST(NULLIF(dg。 ((NULLIF(dg.minb_efektif,0)as float)/(NULLIF(dg.tbs_diolah,0)))) - (447.6 *((CAST(NULLIF(dg.minyak_efektif,0)as float)/(NULLIF(dg.tbs_diolah,0)) )+(CAST(NULLIF(dg.inti_efektif,0)as float)/(NULLIF(dg.tbs_diolah,0))))))) - (((((cpo-ongkos_ms)* CAST(NULLIF(dg.minyak_efektif, 0)as float)/(NULLIF(dg.tbs_diolah,0)))+((pko-ongkos_is)* CAST(NULLIF(dg.inti_efektif,0)as float)/(NULLIF(dg.tbs_diolah,0))) ) - (447.6 *((CAST(NULLIF(dg.minyak_efektif,0)as float)/(NULLIF(dg.tbs_diolah,0)))+(CAST(NULLIF(dg.inti_efektif,0)as float)/ (dg.tbs_diolah,0))))))* 0.02)) 作为harga_beli_tbs_bersih FROM cpopko CPO LEFT JOIN DAILY_GUU AS DG ON CONVERT(日期时间,dg.tglolah,103)= cpo.tangg al LEFT JOIN PNL_TR_HARGA_KOMODITI AS ko ON ko.tanggal = cpo.tanggal WHERE YEAR(cpo.tanggal)> ='为数据类型int。
我完全对这个错误感到困惑。我已经从谷歌做了一些研究,但仍然无法解决问题。希望你们能帮助我 - 事先感谢。
我已经全部投在PARAMS“@查询”字符串为varchar,但没有结果出来。我是否需要在'@cols'中输入参数太先生?执行和Sp_executesql thnks之间的区别是什么be4 sir – Jsnow
@Jsnow - 将参数值传递给静态查询并检查它是否返回任何记录。 'SP_EXECUTESQL'允许您在动态查询中将值传递给变量,以避免SQL注入。你也可以从动态查询结果中获得结果。点击此处查看更多信息https://msdn.microsoft.com/en-us/library/ms188001.aspx –
此旋转表根据上表中的值获取了动态列。从我学会返回的东西我们可以使用函数,但要返回表值,我们必须预定义临时表及其列。我们如何根据查询结果在其列动态的函数中创建一个临时表。先谢谢先生。 – Jsnow