Sql server 转换[T-SQL/SQL Server]时转换失败

Sql server 转换[T-SQL/SQL Server]时转换失败,sql-server,stored-procedures,Sql Server,Stored Procedures,每次尝试调用存储过程时,都会出现以下错误: Msg 245,16级,状态1,程序p_KB_GET_GK_UEBERSICHT,第16行 将varchar值“多样化”转换为数据类型int时,转换失败 某些示例值或示例调用如下所示: 执行官p_KB_GET_GK_UEBERSICHT,,,,,,'D2335548','Lindner' 我完全不理解这个错误消息。他指的是什么。此外,转换为INT可能会出现什么问题?第二个和最后一个参数是INT,但即使没有单引号,错误消息也保持不变 为了向您提供所有信息

每次尝试调用存储过程时,都会出现以下错误:

Msg 245,16级,状态1,程序p_KB_GET_GK_UEBERSICHT,第16行

将varchar值“多样化”转换为数据类型int时,转换失败

某些示例值或示例调用如下所示:

执行官p_KB_GET_GK_UEBERSICHT,,,,,,'D2335548','Lindner'

我完全不理解这个错误消息。他指的是什么。此外,转换为INT可能会出现什么问题?第二个和最后一个参数是INT,但即使没有单引号,错误消息也保持不变

为了向您提供所有信息,我将添加存储过程

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[P_KB_GET_GK_UEBERSICHT]
@status tinyint, @jahr int, @cl_vnr bigint, @cl_name nvarchar(50), @sgi nvarchar(20), @gknr nvarchar(4), @gkname varchar(50), @gueltjahr int

AS

if @cl_vnr = '' set @cl_vnr = 0
if @status = '' set @status = 0
if @jahr = '' set @jahr = 0
if @gueltjahr = '' set @gueltjahr = '0'
if @gknr = '' set @gknr = '0'
if @gknr IS NULL set @gknr = '0'


if @gueltjahr = '0'
    select distinct CL_ID, CD_CLVID, CD_VERSION, CL_NAME, CD_JAHR, ST_NAME as CD_STATUS,
        case isNULL(CD_AKTIV,0) when 0 then 'Nein' when 1 then 'Ja' end as CD_AKTIV,
        CD_STATUS as CD_STATUS_ID, CD_VON, CD_BIS 
    from dbo.V_KB_CLUSTER d
    inner join dbo.V_KB_CLUSTER_GK k on d.CD_CLVID = k.KD_CLVID
    left join dbo.T_KB_GK_STATUS on CD_STATUS = ST_ID
    where   d.CL_ART = 'GK'
            and CD_STATUS = case when @status = 0 then CD_STATUS else @status end
            and CD_JAHR = case when @jahr = 0 then CD_JAHR else @jahr end
            and CD_CLVID = case when @cl_vnr = 0 then CD_CLVID else @cl_vnr end
            and CL_NAME like '%' + @cl_name + '%'
            and k.KD_NR = case when @gknr = '0' then k.KD_NR else @gknr end
            and k.GK_KUNDE like '%' + @gkname + '%'
    order by CL_ID, CD_JAHR DESC, CD_VERSION DESC
else
    select distinct CL_ID, CD_CLVID, CD_VERSION, CL_NAME, CD_JAHR, ST_NAME as CD_STATUS,
        case isNULL(CD_AKTIV,0) when 0 then 'Nein' when 1 then 'Ja' end as CD_AKTIV,
        CD_STATUS as CD_STATUS_ID, CD_VON, CD_BIS 
    from dbo.V_KB_CLUSTER d
    inner join dbo.V_KB_CLUSTER_GK k on d.CD_CLVID = k.KD_CLVID
    left join dbo.T_KB_GK_STATUS on CD_STATUS = ST_ID
    where   d.CL_ART = 'GK'
            and CD_STATUS = case when @status = 0 then CD_STATUS else @status end
            and CD_JAHR = case when @jahr = 0 then CD_JAHR else @jahr end
            and CD_CLVID = case when @cl_vnr = 0 then CD_CLVID else @cl_vnr end
            and CL_NAME like '%' + @cl_name + '%'
            and k.KD_NR = case when @gknr = '0' then k.KD_NR else @gknr end
            and k.GK_KUNDE like '%' + @gkname + '%'
            and @gueltjahr between year(CD_VON) and isNULL(year(CD_BIS),@gueltjahr)
    order by CL_ID, CD_JAHR DESC, CD_VERSION DESC 
我正在使用SQLServer2008

更新:它不适用于数值:


exec p_KB_GET_GK_UEBERSICHT 0,0,0,,'D2335548','Lindner',0

您对存储过程的调用是错误的。SQL Server希望前三个参数分别为tinyint、int和bigint,但您传递的是解释为varchar的参数。看看你的进程,我认为如果你想要默认值,你需要把这三个都传递为0

编辑

您的SQL是错误的。替换

if @gueltjahr = '0'


可能您使用错误的顺序调用参数的存储过程。我假设它接收到一个varchar'divident',其中它需要一个整数,因此它尝试将'divident'强制转换为int,但失败了,因为它显然不是一个数字。此外,还会给您一个发生错误的行号。第16行到底是什么?我觉得你的方法是对的。这似乎与将这些值放在引号中有关。CD_AKTIV列的数据类型是什么?@Rokuto tinyintI我确信在何处有问题。我不知道您为什么要将数值变量与例如if@cl\u vnr=进行比较@cl_vnr可以是或NULL,也可以是数值。列CD_STATUS、CD_CLVID的数据类型是什么?很有趣。。好的,我在经典asp中构建了一个查询,所以虽然我没有检查每个值,但我使用了“&requestmyPost&”。将这些值更改为nvarchar后,它可以工作,但感觉不正确。请显示您的构建语句。您不应该将这些值作为varchar传递。您需要做的是传递0,而不带任何引号,并将它们保留为先前在过程中定义的值。
if @gueltjahr = 0