2017-01-20 7 views
0

У меня есть таблица:Как использовать параметры в выбранном запросе?

Таблица Имя: tbl_Income

EmployeeID  Element  FinancialYear Jan Feb Mar 

00402060   Basic   2016-2017  100 200 300 
00402060   HRA   2016-2017  100 200 300 
00402060   DA   2016-2017  100 200 300 

В котором я хочу, чтобы извлечь данные из tbl_Income.

В котором я выбираю ниже проблему.

Declare @Month varchar(10) = 'Jan' 

select @Month from tbl_Income where EmployeeID = '00402060' and Element = 'Basic' and FinancialYear = '2016-2017' 

Я хочу ниже выхода

OUTPUT : 

    Jan 
1 100  

Пожалуйста, помогите мне ...

+0

Вам нужно будет сделать это с помощью динамического SQL. Между прочим, это не очень хороший дизайн базы данных. – HoneyBadger

+0

Для достижения этой цели вы можете использовать регистр case. – TechEnthusiast

ответ

2

Вы можете использовать динамический SQL, как это:

declare @sql nvarchar(max) 
Declare @Month varchar(10) = 'Jan' 
declare @income int 

set @sql = 'select @inc=' + @Month + ' from tbl_Income where EmployeeID = ''00402060'' and Element = ''Basic'' and FinancialYear = ''2016-2017''' 

exec sp_executesql @sql, N'@inc int OUTPUT', @[email protected] OUTPUT 
select @income as income 

Остерегайтесь, однако, что это работает к атаке SQL Injection.

Вам будет лучше исправить ваш дизайн.

+0

Как сохранить это значение «100» в переменной? пожалуйста, помогите мне .. @ GurV –

+0

можно проверить мой ответ, я сохранил это значение в одном варианте. @ DhavalPurohit – Chanukya

+0

@Chanukya - Ваш ответ точно такой же, как у меня.Dhaval - Посмотрите на [это] (http://stackoverflow.com/questions/3840730/getting-result-of-dynamic-sql-into-a-variable-for-sql-server) – GurV

1
Declare @Month varchar(10) = 'Jan' 
declare @v nvarchar(max) 
declare @v1 INT 
set @v =CONCAT('select @v1=' ,@month, ' from 
table_a where EmployeeID = ''00402060'' and Element = ''Basic'' and FinancialYear = ''2016-2017''') 
PRINT @V 
EXECUTE sp_executesql @v,N'@V1 INT OUTPUT', @[email protected] OUTPUT; 
SELECT @V1; 
0

[Пример базы данных Дизайн] [1]

[1]: https://i.stack.imgur.com/2vxEb.png - таблица "dbo.Month"

CREATE TABLE dbo.Month (
    Id int NOT NULL, 
    Name nvarchar(50) NOT NULL, 
    CONSTRAINT PK_Month PRIMARY KEY CLUSTERED (Id) 
) 

- таблица IncomeType»

CREATE TABLE dbo.IncomeType (
    Id int NOT NULL, 
    Name nvarchar(50) NOT NULL, 
    CONSTRAINT PK_IncomeType PRIMARY KEY CLUSTERED (Id) 
) 

- таблица "FinancialYear"

CREATE TABLE dbo.FinancialYear (
    Id int NOT NULL, 
    YearSpan nvarchar(50) NOT NULL, 
    CONSTRAINT PK_FinancialYear PRIMARY KEY CLUSTERED (Id) 
) 

- таблица "Сотрудник"

CREATE TABLE dbo.Employee (
    Id int NOT NULL, 
    Name nvarchar(50) NOT NULL, 
    CONSTRAINT PK_Employee PRIMARY KEY CLUSTERED (Id) 
) 

- таблица "Доход"

CREATE TABLE dbo.Income (
    Id int NOT NULL, 
    EmployeeId int NOT NULL, 
    TypeId int NOT NULL, 
    YearSpanId int NOT NULL, 
    MonthId int NOT NULL, 
    CONSTRAINT PK_Income PRIMARY KEY CLUSTERED (Id) 
) 

--Alter Каждая таблица, чтобы добавить ссылки на внешние ключи

ALTER TABLE Income 
    ADD CONSTRAINT FK_Income_Employee FOREIGN KEY (EmployeeId) REFERENCES Employee (Id) 

    ALTER TABLE dbo.Income 
    ADD CONSTRAINT FK_Income_FinancialYear FOREIGN KEY (YearSpanId) REFERENCES dbo.FinancialYear (Id) 


    ALTER TABLE dbo.Income 
    ADD CONSTRAINT FK_Income_IncomeType FOREIGN KEY (TypeId) REFERENCES dbo.IncomeType (Id) 

    ALTER TABLE dbo.Income 
    ADD CONSTRAINT FK_Income_Month FOREIGN KEY (MonthId) REFERENCES dbo.Month (Id) 
  1. Работодатель eeID выйдет из таблицы Employee
  2. элемент выйдет из таблицы типа дохода
  3. FinancialYear --from финансовый год таблица
  4. MonthId из таблицы месяцев

Теперь простое соединение может помочь вам получить каждое значение с использованием ссылок на внешние ключи