2014-09-08 1 views
0

Я создал таблицу с одним из имен столбцов AS, определяемой пользователем. Я успешно вставил данные в таблицу, но я не могу выбрать и просмотреть всю таблицу.Проблема с отображением таблицы в SQL

CREATE TABLE Member_Profile(
Gender   CHAR(1), 
Name   VARCHAR(50), 
D_O_B   DATE, 
Weight   DECIMAL(10,2), 
Height   DECIMAL(10,2), 
Smoker   CHAR(1), 
Salary   INT, 
MemberID  INT, 
Cupid_Score AS [dbo].[Q3CupidUDF](Gender,Name,D_O_B,Weight,Height,Smoker,Salary), 
PRIMARY KEY(MemberID) 
) 

INSERT INTO Member_Profile VALUES('M', 'Tim', '01-01-82', 97.0, 1.88, 'N', 65000, 1) 
SELECT * FROM Member_Profile 

Это ОДС для таблицы ----

CREATE FUNCTION [dbo].[Q3CupidUDF] 
(
@Gender   CHAR(1), 
@Name   VARCHAR(15), 
@DOB   DATE, 
@Weight   DECIMAL(10,2), 
@Height   DECIMAL(10,2), 
@Smoker   CHAR(1), 
@Salary   INT 
) 
RETURNS INT 
AS 
BEGIN 
DECLARE @CupidScore INT 
DECLARE @Age INT 
SELECT @Age = DATEDIFF(YEAR, @DOB, GETDATE()) 

SELECT @CupidScore = CASE 
    WHEN @Age between 20 and 30 THEN 5 
    WHEN @Age between 31 and 40 THEN 4 
    WHEN @Age between 41 and 50 THEN 3 
    WHEN @Age > 50 THEN 2 
    ELSE 0 
END 

DECLARE @WtHt DECIMAL(2,1) 
SET @WtHt = @Weight/(@Height*@Height) 

SET @CupidScore = @CupidScore + CASE 
    WHEN @WtHt between 20 and 25 THEN 1 
    WHEN @WtHt between 25 and 30 THEN 3      
    WHEN @WtHt between 30 and 35 THEN 4 
    WHEN @WtHt between 35 and 40 THEN 2 
    ELSE 0 
END 

IF @Smoker = 'Y' SET @CupidScore = @CupidScore + 2 

SET @CupidScore = @CupidScore + CASE 
    WHEN @Salary < 50000 THEN 1 
    WHEN @Salary between 50001 and 60000 THEN 2 
    WHEN @Salary between 60001 and 70000 THEN 3 
    WHEN @Salary > 70000 THEN 4 
END 

RETURN @CupidScore 
END 
+1

Что сообщение об ошибке? –

+1

Вы можете показать sql для UDF? – Donal

+0

Это ошибка, которую я получаю при выполнении оператора select: «Ошибка арифметического переполнения, преобразующая числовые данные в числовой тип данных». –

ответ

1

Проблема связана с усечением данных внутри UDF. Проблема в том, что вычисление, которое вы делаете, возвращает десятичное значение с гораздо большим количеством мест, чем вы указали в своей переменной.

DECLARE @WtHt DECIMAL(2,1) 

Должен быть объявлен как:

DECLARE @WtHt decimal(10,7) 

Это происходит потому, что следующий расчет возвращает значение, как это: 27.444545043006

SET @WtHt = @Weight/(@Height*@Height) 

Вот рабочий пример: http://sqlfiddle.com/#!3/a874f/1/0

+0

Это действительно решает мою арифметическую ошибку, но Я не понимаю, почему оценка амура равна null –

+0

Здесь не пусто: http://sqlfiddle.com/#!3/60f0d/1/0 – Donal

+0

О, спасибо, похоже, он не работает на зарплату из 50000, должно быть, что-то случилось, я вижу, должен иметь зарплату <50001 не <50000. Спасибо за помощь. –

0

у меня нет SQL-сервер на передо мной, но вы пробовали изменения @wtht быть десятичными (10, 2)?

Смежные вопросы