在SQL Server触发器中转换(varchar到int)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在SQL Server触发器中转换(varchar到int)相关的知识,希望对你有一定的参考价值。

我有个问题。这是我第一次尝试在SQL Server中编写与SELECTINSERT不同的东西。我无法解决问题。

我有这个触发器

ALTER TRIGGER [dbo].[createTaxes] ON [dbo].[Customers]
AFTER  INSERT AS
BEGIN
   DECLARE @dayly varchar(10),
           @weekly varchar(10),
           @mountly varchar(10),
           @CustomerID int;

   SET @dayly =  'SELECT cast(daily as smallmoney) FROM Rates WHERE id = 1 ' 
   SET @weekly = 'SELECT cast(weekly as smallmoney) FROM Rates WHERE id = 1'             
   SET @mountly = 'SELECT cast(mountly as smallmoney) FROM Rates WHERE id = 1'
   SET @CustomerID ='SELECT CONVERT(INT, CustomerID) FROM INSERTED'         

   INSERT INTO RentalRates(CustomerId, Daily, Monthly, Weekly)
   VALUES ('SELECT  CAST(@CustomerID AS int)', 'SELECT  CAST(@dayly AS smallmoney)',
           'SELECT  CAST(@mountly AS smallmoney)', 'SELECT  CAST(@weekly AS smallmoney)');

END

我尝试了很多组合,但它不起作用:(

目前错误是

将varchar值'SELECT CONVERT(INT,CustomerID)FROM INSERTED'转换为数据类型int时转换失败。

提前感谢浪费时间。

我无法理解为什么转换不起作用?我需要做些什么才能正确转换它。

答案

这里有两个问题

您使用的变量只能包含单个值,而INSERTED实际上是一组零,一个或多个记录,并且您希望为每个记录插入租赁费率

更糟糕的是,您将查询文本分配给它们而不是查询结果

 SET @CustomerID ='SELECT CONVERT(INT, CustomerID) FROM INSERTED' 

代替

 SET @CustomerID =(SELECT CONVERT(INT, CustomerID) FROM INSERTED) 

这就是为什么你得到你看到的错误。您正在尝试将@customerID的值设置为45个字符的长字符串'SELECT CONVERT(INT,CustomerID)FROM INSERTED'

如果您一次只添加一条记录,那么将该变量和其他变量排序可能会有效,但实际上您应该完全丢失变量。

您的INSERT语句应该是这样的

INSERT INTO RentalRates(CustomerId,Daily,Monthly,Weekly)
CONVERT(INT, i.CustomerID),
cast(r.daily as smallmoney),
cast(r.weekly as smallmoney) ,
cast(r.mountly as smallmoney) 
FROM INSERTED i
JOIN Rates r ON r.id = 1 

以上是关于在SQL Server触发器中转换(varchar到int)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中将 varchar 数据转换为时间

使用自定义格式在 SQL Server 上将 varchar 转换为 datetime

SQL Server 2012 将数据类型 varchar 转换为数字时出错

在没有科学计数法的 SQL Server 中将 float 转换为 varchar

在 SQL Server 中将 varchar 'hh:mm:ss' 转换为 datetime hh:mm:ss

SQL Server Always Encrypted:操作数类型冲突:varchar 与 varchar(max) 不兼容