В C ++ у struct
s нет оператора сравнения, сгенерированного по умолчанию. Вы должны написать свой собственный:
bool operator==(const MyStruct1& lhs, const MyStruct1& rhs)
{
return /* your comparison code goes here */
}
Вы можете создать для этого пользовательскую функцию:
CREATE FUNCTION dbo.GetValue(@ncode INT, @recid INT)
RETURNS INT
AS
SELECT @recid * nvalue
FROM c_const
WHERE code = @ncode
, а затем использовать ее для определения вычисляемого столбца:
ALTER TABLE dbo.YourTable
ADD NewColumnName AS dbo.GetValue(ncodeValue, recIdValue)
Кажется, это больше подходит для представлений (индексированных представлений, если вам нужен быстрый поиск по вычисляемому столбцу):
CREATE VIEW AnyView
WITH SCHEMABINDING
AS
SELECT a.rec_id, a.s_id, a.n_code, a.rec_id * c.nvalue AS foo
FROM AnyTable a
INNER JOIN C_Const c
ON c.code = a.n_code
Это имеет тонкое отличие от версии подзапроса в том, что он будет возвращать несколько записей вместо того, чтобы выдавать ошибку, если есть несколько результатов для объединения. Но это легко решается с помощью UNIQUE
ограничения на c_const.code
(я подозреваю, что это уже PRIMARY KEY
).
Это также намного проще для понимания, чем версия с подзапросом.
Вы можете сделать это с помощью подзапроса и UDF, как показал marc_s, но это, вероятно, будет очень неэффективно по сравнению с простым JOIN
, поскольку скалярный UDF нужно будет вычислять строку за строкой.