调用存储过程,提示:从数据类型 nvarchar 转换为 float 时出错。 请问哪里的错?(不好意思没分了)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用存储过程,提示:从数据类型 nvarchar 转换为 float 时出错。 请问哪里的错?(不好意思没分了)相关的知识,希望对你有一定的参考价值。

-----创建存储过程
create proc Select_ApplyList(@StartTime varchar(20), @EndTime varchar(20),@ChannelID nvarchar(50),@CheckedMark int,@IDCardName varchar(20),@StartNum int,@EndNum int)
as
declare @strSql nvarchar(4000)
set @strSql='select * from (select Row_Number() Over(order by IDCardName) as rowNum,A.ApplyID,A.StudentID,A.ApplyCode,A.MemberTypeID,D.MemberName,A.SalesID,A.TeamID,A.ProvincePrice,A.ChannelID from DATApplyListStudent A left join BASMemberShip D on A.MemberTypeID=D.MemberTypeID where A.Isdelete=0';
if (@ChannelID !='00000000-0000-0000-0000-000000000000')
set @strSql=@strSql+ ' AND A.ChannelID in (select ChannelID from BASChannel where ParantID='''+str(@ChannelID)+'''or ChannelID='''+str(@ChannelID)+''')';
set @strSql=@strSql+') as a where rowNum between'+str(@StartNum)+' and'''+str(@EndNum)+'';
exec sp_executesql @strSql
---调用存储过程
exec Select_ApplyList '2011-07-01','2011-07-31 ,'41e620ee-b34c-499c-b0e6-fc454583e63f',0,'',1,50

参考技术A 先看看STR函数的说明:
语法
STR ( float_expression [ , length [ , decimal ] ] )
参数
float_expression
是带小数点的近似数字 (float) 数据类型的表达式。不要在 STR 函数中将函数或子查询用作 float_expression。
length
是总长度,包括小数点、符号、数字或空格。默认值为 10。
decimal
是小数点右边的位数。

你的@channelID这个变量,本身就是NVARCHAR类型,而你又使用STR函数转化,这里要求STR里面的参数是FLOAT类型的,所以错误在这。使用这个函数,因为参数是FLOAT,所以这里要先把你的变量转成FLOAT,所以就报错了。
set @strSql=@strSql+ ' AND A.ChannelID in (select ChannelID from BASChannel where ParantID='''+str(@ChannelID)+'''or ChannelID='''+str(@ChannelID)+''')';
问题就在上面这句,不需要str函数转化,直接拼就好了。
另外,你调用的时候应该是笔误写错了吧,2011-07-31,后边一半缺少了单引号。
还有,最后一个拼接
set @strSql=@strSql+') as a where rowNum between'+str(@StartNum)+' and'''+str(@EndNum)+'';
你看看这句,最后的单引号拼接是否有误,你看看and后边的单引号,这个地方肯定匹配不上了.
你可以在存储过程中,没拼接完一段之后加上这句print @strsql,把字符串输出,看看语句有没有问题,一目了然。看看最后的and,是不是在and 的后边多了一个单引号?

从存储过程中的参数表中提取参数?

【中文标题】从存储过程中的参数表中提取参数?【英文标题】:Extract parameters from a table of parameters in a stored procedure? 【发布时间】:2016-02-19 16:30:45 【问题描述】:

我定义了下一个数据类型:

CREATE TYPE dbo.FieldsTable AS TABLE
(
    [Name]  nvarchar(255),
    [Value] nvarchar(255)
)

我想用这个符号声明一个存储过程:

CREATE PROCEDURE dbo.uspSaveEntity
(
    @Id int,
    @Fields [FieldsTable] readonly
)
AS
...

此过程应该接收一个 FieldsTable 类型,其中包含我需要在实体的 UPDATE 中设置的字段和值的列表。

例如,要调用我想做的程序,例如:

DECLARE @entityFields FieldsTable;

INSERT INTO @entityFields VALUES ('FirstName', 'John');
INSERT INTO @entityFields VALUES ('LastName', 'Doe');

EXEC uspSaveEntity 1500, @entityFields

问题是:如何从收到的表格中提取参数?

直到现在我还在想这样的事情:

SET @FirstName = (SELECT Value FROM @Fields WHERE Name = 'FirstName');
SET @LastName = (SELECT Value FROM @Fields WHERE Name = 'LastName');
...
UPDATE tblEntity SET FirstName = @FirstName ...

我认为对每个字段使用 SET 和 SELECT 可能代码太多......是否存在一些更清楚的方法来做到这一点?

UPDATE 查询和所有存储过程不需要是动态的,但需要支持有这种特殊的方式来接收参数。

【问题讨论】:

【参考方案1】:

个别set 的陈述是相当合理的。另一种方法是枢轴或条件聚合:

select @FirstName = max(case when Name = 'FirstName' then Value end),
       @LastName = max(case when Name = 'LastName' then Value end),
       . . .
from @Fields;

【讨论】:

我喜欢你建议的这种方式,我想这样做:SELECT @ FirstName = COALESCE(MAX(CASE WHEN Name = 'FirstName' THEN Value END), 'Default'), @ LastName = COALESCE(MAX(CASE WHEN Name = 'LastName' THEN Value END), 'Default') FROM @ Fields 要具有默认值。谢谢!【参考方案2】:

您拥有的表是本地表,我怀疑行数很少。因此,从性能角度来看,每个解决方案都是相同的。在这种情况下,我更喜欢更具可读性的解决方案。可以直接在select中选择变量中的值,而不需要使用set语句:

SELECT @FirstName = Value FROM @Fields WHERE Name = 'FirstName';

【讨论】:

以上是关于调用存储过程,提示:从数据类型 nvarchar 转换为 float 时出错。 请问哪里的错?(不好意思没分了)的主要内容,如果未能解决你的问题,请参考以下文章

Delphi调用存储过程

从存储过程中的参数表中提取参数?

mySQL 存储过程中未知的无效类型转换

PLSQL 将 NVARCHAR2 从 BASE64 解码为 UTF-8

如何使用 Nvarchar(max) 参数创建 CLR 存储过程?

大型nvarchar2值返回时的oracle存储过程错误