传递参数时,SQL函数引发类型错误

时间:2019-02-19 14:15:37

标签: sql sql-server tsql

该函数试图返回一个整数值,该整数值等于列中零之前出现的值的总和,并将其加到列中的最终值。

CREATE FUNCTION name
     (@p1 NVARCHAR(MAX),
      @p2 INT, 
      @p3 INT)
RETURNS INT
AS 
BEGIN
    DECLARE @total INT = 0
    DECLARE @cnt INT = 1;
    DECLARE @row INT = 0
    DECLARE @nextRow INT = 0;
    DECLARE @tmp NVARCHAR(MAX)

    SET @tmp = @p1

    DECLARE @myTemp TABLE (Col INT, ID1 INT, ID2 INT, reading NVARCHAR(MAX));
    DECLARE @zeroCols TABLE(rn INT, Col INT);


    INSERT INTO @myTemp
        SELECT ROW_NUMBER() OVER(ORDER BY nHeatID) Col, col2, col3, @tmp 
        FROM schema.table
        WHERE col4 = @p2 
          AND col5 = @p3

    SET @total = (SELECT TOP 1 @tmp FROM @myTemp ORDER BY col DESC)

    INSERT INTO @zeroCols
        SELECT ROW_NUMBER() OVER(ORDER BY col) rn, col  
        FROM @myTemp 
        WHERE @tmp = 0

        WHILE @cnt <= (SELECT COUNT(Col) FROM @zeroCols)
        BEGIN
            SET @row = (SELECT Col FROM @zeroCols WHERE rn = @cnt)

            IF ((SELECT @tmp FROM @myTemp WHERE col = @row-1) <> 0)
                SET @total = @total + (SELECT @tmp FROM @myTemp WHERE col = @row-1); 

            SET @cnt = @cnt + 1;
        END;

        RETURN @total
END;

@myTemp表将我表中的数据保留为行号,@zeroCols表中的行号保留为零。

然后,我遍历该组值,并确定在提供的列的零之前是否存在非零值,如果存在,则将其添加到总数中。

这在我尝试使其成为函数之前起作用。

是否不喜欢我以nvarchar作为列名的事实?

当我这样称呼它时:

SELECT name('val', 0, 0)

我收到此错误:

  

将nvarchar值“ val”转换为数据类型int时转换失败

2 个答案:

答案 0 :(得分:2)

我已将问题简化为以下内容:

@p1 nvarchar(max) -- Parameter of the function

--...

DECLARE @total INT = 0
DECLARE @tmp nvarchar(max)
SET @tmp = @p1

--...

DECLARE @myTemp TABLE(Col INT, ID1 INT, ID2 INT, reading nvarchar(max));

--...

SET @total = (SELECT TOP 1 @tmp FROM @myTemp ORDER BY col DESC) -- Can't convert property

您正在将@tmpNVARCHAR(MAX))的值分配给@total的{​​{1}}。

我无法推断出您要对此做些什么,因此我无法提出解决方案,只是确保分配匹配的数据类型。

答案 1 :(得分:0)

我发现如果使用开关,则可以根据参数确定列名。

Can I pass column name as input parameter in SQL stored Procedure