2017-06-13 152 views
0

在MS SQL Server中,可以在create table語句中定義compute列,例如,SAS - 在Proc Sql中添加計算列/變量創建表

CREATE TABLE dbo.Products 
( 
    ProductID int 
    , QtyAvailable smallint 
    , UnitPrice money 
    , InventoryValue AS QtyAvailable * UnitPrice 
); 

SAS proc sql中是否有等價選項?

以下拋出語法錯誤:

proc sql; 
CREATE TABLE work.Products 
( 
    ProductID num 
    ,QtyAvailable num 
    ,UnitPrice num format euro8.2 
    , InventoryValue AS QtyAvailable * UnitPrice 
); 
quit; 

回答

1

它不可能在SAS的物理表定義計算列。相反,一個必須創建該數據的物理基表,和用於計算列的圖,例如,如下:

proc sql; 
create table work.products_base 
( 
    ProductID num 
    ,QtyAvailable num 
    ,UnitPrice num format euro8.2 
); 
CREATE view work.Products as 
    select 
    ProductID 
    ,QtyAvailable 
    ,UnitPrice 
    ,QtyAvailable * UnitPrice as InventoryValue 
    from work.products_base; 

insert into work.products 
    set productid=1, qtyavailable=2,unitprice=3; 

嘗試爲InventoryValue添加一個值拋出一個警告:

169 set productid=1, qtyavailable=2,unitprice=3, inventoryvalue=4; 
WARNING: Cannot provide InventoryValue with a value because it references a derived 
column that can't be inserted into. 

另一種方法是使用一個約束,這意味着一個物理表,但它確實需要開發者確保正確的值被真正加載到它(所以它不被計算並佔用物理磁盤空間)。

proc sql; drop table work.products; 
create table work.products_base 
( 
    ProductID num 
    ,QtyAvailable num 
    ,UnitPrice num format euro8.2 
    ,InventoryValue num 
    ,constraint InventoryValue check(InventoryValue = QtyAvailable * UnitPrice) 
); 
insert into work.products_base set qtyavailable=2,unitprice=2,inventoryvalue=4; 
insert into work.products_base set qtyavailable=2,unitprice=2,inventoryvalue=2; 

第二INSERT語句拋出一個錯誤:

ERROR: Add/Update failed for data set WORK.PRODUCTS_BASE because data value(s) do not comply 
     with integrity constraint InventoryValue. 

當然 - 如果你實際上是在SQL Server中創建表,那麼你可以使用通過語法來創建計算列..

+0

我已經 - 但它也不工作:(它適用於選擇語句,但不適用於創建一個空表 – kristof

+0

道歉 - 我誤解了 - 2分鐘,會看看 –

+0

謝謝@allan我想這個公式被定義在元數據上因此如果您要創建SAS表,則不要將數據插入InventoryValue – kristof