【问题标题】:How to use parameters in select query?如何在选择查询中使用参数?
【发布时间】:2017-06-05 06:20:26
【问题描述】:

我有桌子:

表名: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    

请帮帮我...

【问题讨论】:

  • 您必须使用动态 SQL 来做到这一点。顺便说一句,这不是一个很好的数据库设计。
  • 你可以使用case语句来实现。

标签: sql sql-server sql-server-2008 select sql-server-2008-r2


【解决方案1】:

您可以像这样使用动态 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', @inc=@income OUTPUT
select @income as income

请注意,这可能会受到 SQL 注入攻击。

你最好修复你的设计。

【讨论】:

  • 如何将这个输出'100'值存储在变量中?请帮帮我..@GurV
  • 你能检查我的答案吗?我将该值存储在一个变量中..@DhavalPurohit
  • @Chanukya - 你的答案和我的完全一样。 Dhaval - 看看this
  • 是的,答案是一样的...... Mr.GurV 我想将此输出值存储在一个变量中,例如“declare XVariable decimal(18,2)”,现在我想将此输出存储在X变量...
  • @GurV 他写了选择查询,但我在动态查询中这样做了请检查
【解决方案2】:

[示例数据库设计][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)
)

-- 表收入类型"

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

-- 表“财政年”

    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 Each Table 添加外键引用

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. EmployeeID 将来自 Employee 表
  2. 元素将来自收入类型表
  3. FinancialYear -- 来自财政年度表
  4. 月份表中的 MonthId

现在一个简单的连接可以帮助您使用外键引用获取每个值

【讨论】:

    【解决方案3】:
    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', @V1=@V1 OUTPUT;  
    SELECT @V1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 2018-03-07
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多