用于构造sql查询的存储过程 - SQL

时间:2018-06-13 08:48:07

标签: sql-server sql-server-2008

我有2个表“Tbl1”,其中包含3行,如下表所示

  ColNames
  *********
   Name
   SurName
   DOB

我的第二个表“tbl2”包含与Name,SurName和DOB相关的信息,如下所示:

Name        SurName      DOB
***********************************
SAM         billing      22/11/2000
NULL        petres       22/11/2000
BILL        Jones        NULL
Dave        NULL         22/11/2000

假设,如果从tbl1中选择名称和DOB ,我想从第二个表中提取NOT NULL值。

JOINS不是一个选项,所以请不要这么做。遗憾....

到目前为止我所做的是构建了一个存储过程,它将 Name和DOB 保存为tbl1中的行到#temp_table。

我现在想构建一些存储过程,为我构建一个查询,从tbl2中选择“NOT NULL”值。

ALTER PROCEDURE spShowRuleValues
AS
BEGIN
SELECT 'SELECT * FROM ' + 'tbl2' + ' WHERE '+
    stuff((SELECT ', ' + Header FROM #temp_table
    FOR Xml path('')
    ),1,2,'') + ' IS NOT NULL ';
END

execute spShowRuleValues

但是,在执行此存储过程时,我只能开发一个查询:

`SELECT * FROM tbl2 WHERE Name, DOB IS NOT NULL `

如何以构建为:

的方式构建查询
SELECT * FROM tbl2 WHERE Name IS NOT NULL AND
DOB IS NOT NULL

然后执行此查询以从tbl1获取结果,不包括NOT NULL值。

请随意建议我可以用来构建所需查询的另一种方法。感谢您提前花时间考虑。

1 个答案:

答案 0 :(得分:1)

尝试稍微更改SELECT ... FOR XML PATH

ALTER PROCEDURE spShowRuleValues
AS
BEGIN

    DECLARE @WhereCondition VARCHAR(MAX) = STUFF(
        (
            SELECT 'AND T.' + QUOTENAME(Header) + ' IS NOT NULL' FROM #temp_table FOR Xml path('')
        ),1,4,'');

    SELECT 'SELECT * FROM tbl2 AS T WHERE '+ @WhereCondition

END