该函数试图返回一个整数值,该整数值等于列中零之前出现的值的总和,并将其加到列中的最终值。
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时转换失败
答案 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
您正在将@tmp
(NVARCHAR(MAX)
)的值分配给@total
的{{1}}。
我无法推断出您要对此做些什么,因此我无法提出解决方案,只是确保分配匹配的数据类型。
答案 1 :(得分:0)
我发现如果使用开关,则可以根据参数确定列名。
Can I pass column name as input parameter in SQL stored Procedure