如何基于相同的行字段自动完成SQL字段

时间:2017-01-12 16:30:52

标签: sql ssms

问题已经更新:

我们说我有两张桌子:

表1 ID_Ticket | Ticket_Quantity | Total_Price(Calculated field) -------------------------------------------- 2 | 5 | x 1 | 3 | y

表2
ID_Ticket | Ticket_Price ------------------------ 1 | 4.5 2 | 5 我希望阻止数据库用户填写Total_Price字段(通过编辑前200行或查询),而我希望将其计算为Ticket_Price * Ticket_Quantity并自动插入该行。

在这种情况下, x应为25 y应为13.5 (一旦Ticket_Quantity和Ticket_Price为自动值,则应自动插入值填写该行)

我写了这样一个函数:
CREATE FUNCTION Multiply(@x DECIMAL(19,4), @y DECIMAL (19,4)) RETURNS DECIMAL(19,4) AS BEGIN SELECT @x * Ticket_Price FROM Table2 WHERE ID_Ticket = @y END

但是有一个错误:

函数中包含的Select语句无法将数据返回给客户端

当我想根据功能添加计算字段时:
ALTER TABLE Purchases ADD Total_Price AS Multiply(Table2.Ticket_Price,Ticket_Quantity);
查询没有执行并给我这个错误:
<登记/> 多部分标识符&#34; Product.Prod_Price&#34;无法受约束。


如何调用表2中的值并修复乘法函数?

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,所以我会将它发布给有同样问题的未来读者:

在对象资源管理器(左侧面板)中转到此路径:
Databases --> <your_database_name> --> programmability --> functions
右键单击Functions文件夹,然后选择New --> Scalar-valued function
粘贴以下函数脚本(将&lt; variables&gt;替换为与您的数据库对应的那些):

CREATE FUNCTION dbo.Multiply(@id INT, @price DECIMAL(19,4))
--or (@x float, @y money) depending on the type of your columns you have
RETURNS DECIMAL(19,4)
--RETURNS <data_type_of_the_calculated_column_you_want>
AS 
BEGIN
   RETURN 
   (SELECT @price * Ticket_Price
   --SELECT @<second_argument/column_name_of_Table1>*<column_name_of_Table2>
   FROM Table2
   --FROM <your_Table2_name> 
   WHERE ID_Ticket = @id)
   --WHERE <unique/PrimaryKey_Column_to_identify_the_row_in_Table2>
   -- = @<ForeignKey_Column_to_identify_the_row_in_Table2>
END

执行它。
现在创建一个新查询(Ctrl + N)以在Table1中添加计算列,并复制粘贴以下查询:

ALTER TABLE Table1
--ALTER TABLE <your_Table1_name>
ADD Total_Price AS dbo.Multiply(ID_Ticket,Ticket_Quantity);
--ADD <name_of_the_calculated_row_you_like> AS
--   dbo.<Function_Name>(<id_column_name_of_Table2>,<column_name_from_Table1>)

执行查询 现在,计算列应该是Table1和Table2

列的乘法