请问sql中怎么实现字段的动态查询?

比如说 select 字段1,字段2 from table1 left join table2 on......
其中字段1是已经确定的,但字段2还不确定,需要根据字段1返回的记录再具体确定每条记录所对应的字段2。请问怎么实现?求教高手

用动态sql即可实现。

如student表中有如下内容:

现在查询条件不定,但只能是一个字段,如:可能会查sex为男的人,可能会查name为张三的人。可以这样写一个简单的存储过程。

declare @col varchar(20)
declare @sql varchar(2000)
declare @str varchar(20)
set @col='sex'
set @str='男'
set @sql='select * from student where '+@col+'='''+@str+''''
exec (@sql)

结果就是这样的:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-28

给你做了一个简单的例子 ,你自己思考一下

USE tempdb 
GO
IF OBJECT_ID('TABLE1') IS NOT NULL
DROP TABLE TABLE1
GO
CREATE TABLE TABLE1
(cWhCode NVARCHAR(20))
INSERT INTO TABLE1
SELECT 'W01' UNION ALL 
SELECT 'W02' UNION ALL
SELECT 'W03' UNION ALL
SELECT 'W04' UNION ALL
SELECT 'W05' 
GO
IF OBJECT_ID('TABLE2') IS NOT NULL
DROP TABLE TABLE2
GO
CREATE TABLE TABLE2
(
W01 NVARCHAR(20),
W02 NVARCHAR(20),
W03 NVARCHAR(20),
W04 NVARCHAR(20),
W05 NVARCHAR(20)

)

DECLARE @COL NVARCHAR(1000)
SET @COL=''
--拼接动态语句
SELECT  @COL=@COL+',' + CWHCODE FROM TABLE1 
       SET @COL= STUFF(@COL,1,1,'')
--动态查询
exec ('SELECT ' + @COL + ' FROM TABLE2')

第2个回答  2013-06-28
CREATE TABLE #test (
  id  INT,
  start_date  DATE,
  end_date  DATE
);

INSERT INTO #test VALUES(1, '2013-01-01','2013-01-31');
INSERT INTO #test VALUES(1, '2013-03-01','2013-03-07');
INSERT INTO #test VALUES(2, '2013-01-01','2013-03-07');
INSERT INTO #test VALUES(2, '2013-02-01','2013-02-07');
INSERT INTO #test VALUES(2, '2013-03-01','2013-03-07');
INSERT INTO #test VALUES(2, '2013-04-01','2013-04-07');

-- 这里假设  字段1是  id
-- 字段2不确定,需要根据字段1返回的记录再具体确定每条记录所对应的字段2。
-- 假如字段1= 1, 则返回 start_date,  否则返回 end_date

SELECT
  id  AS  [字段1],
  CASE WHEN id = 1 THEN start_date ELSE end_date END AS [字段2]
FROM
  #test;

字段1         字段2
----------- ----------------
          1       2013-01-01
          1       2013-03-01
          2       2013-03-07
          2       2013-02-07
          2       2013-03-07
          2       2013-04-07

(6 行受影响)

本回答被提问者采纳
相似回答