简体   繁体   English

在SQL Server中的变量中传递值

[英]Passing values in a variable in SQL Server

I need an approach to pass values from a SELECT-Statement in a variable in SQL server because I have a lot of checks before the procedure returns a result. 我需要一种从SQL Server变量中的SELECT-Statement传递值的方法,因为在过程返回结果之前,我要进行很多检查。

Firstly I have a SELECT-Statement that checks whether the IDs aren't in a group 'US'. 首先,我有一个SELECT语句,它检查ID是否不在“ US”组中。

// 1. check:
SELECT
    g.artID
FROM
    dbo.G_FID g
INNER JOIN
    dbo.MasterData s
ON
    g.WKN = s.WKN
WHERE
    s.ID <> "US"

All artID s they are not in the US - the group will check for the next SELECT-Statement: 所有artID US artID该小组将检查下一个SELECT-Statement:

// 2. check:
SELECT
    g.artID
FROM
    dbo.G_FID g
WHERE
    (g.FID='68A')
OR
    (g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))

the result of this check continues to the next check and so on. 此检查的结果继续进行下一个检查,依此类推。 Could anyone give me an example how to handle this issue? 谁能给我一个例子来解决这个问题?

You could create a temporary table containing the item and a status column. 您可以创建一个包含项目和状态列的临时表。 At each stage in your procedure you could amend the status so that after all your checks you have know which items you are really interested in. Your first query would be a list of everything <> US with a null status (perhaps) your second query might then set the status to 1 (true/required) etc.. 在您过程的每个阶段,您都可以修改状态,以便在所有检查之后都知道您真正感兴趣的项目。您的第一个查询将是状态为<>(可能是)的所有<> US列表(可能是第二个查询)然后可以将状态设置为1(真/必填),等等。

/*
CREATE TABLE G_FID
(ARTID INT, WKN INT, FID VARCHAR(3), VALUE VARCHAR(2))

CREATE TABLE MASTERDATA
(ID VARCHAR(2), WKN INT)
*/
truncate table g_fid
INSERT INTO G_FID VALUES
(1,1,'1','04'),(2,1,'68A','04'),(3,1,'73','04'),(4,2,'68A','04'),(5,2,'73','04')

TRUNCATE TABLE MASTERDATA
INSERT INTO MASTERDATA VALUES
('UK',1),('US',2) 

IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp

SELECT
    g.artID,g.WKN,g.FID,g.VALUE,s.ID,s.wkn as s_wkn,NULL AS STATUS
INTO #TEMP
FROM
    dbo.G_FID g
INNER JOIN
    dbo.MasterData s
ON
    g.WKN = s.WKN
WHERE
    s.ID <> 'US'

SELECT * FROM #TEMP

UPDATE #TEMP
SET STATUS = 1 WHERE #TEMP.ARTID IN(
SELECT
    g.artID
FROM
    dbo.G_FID g
WHERE
    (g.FID='68A')
OR
    (g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))
)

SELECT * FROM #TEMP

----------- ----------- ---- ----- ---- ----------- -----------
1           1           1    04    UK   1           NULL
2           1           68A  04    UK   1           NULL
3           1           73   04    UK   1           NULL

(3 row(s) affected)

(2 row(s) affected)

artID       WKN         FID  VALUE ID   s_wkn       STATUS
----------- ----------- ---- ----- ---- ----------- -----------
1           1           1    04    UK   1           NULL
2           1           68A  04    UK   1           1
3           1           73   04    UK   1           1

(3 row(s) affected)

You can use Common table expressions if you dont like subqueries 如果您不喜欢子查询,则可以使用Common表表达式

with G_FID_CTE
as 
(
   SELECT *
   FROM dbo.G_FID g
   INNER JOIN dbo.MasterData s
           ON g.WKN = s.WKN
   WHERE s.ID <> "US"
)

SELECT g.artID
FROM G_FID_CTE g
WHERE (g.FID='68A')
OR    (g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))

To use multiple: 要使用多个:

--first
with G_FID_CTE
as 
(
   SELECT *
   FROM dbo.G_FID g
   INNER JOIN dbo.MasterData s
           ON g.WKN = s.WKN
   WHERE s.ID <> "US"
),

--second
with G_FID_CTE2
as 
(
   SELECT *
   FROM G_FID_CTE g
   WHERE <some_expression>
)

SELECT g.artID
FROM G_FID_CTE2 g
WHERE (g.FID='68A')
OR    (g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))

You can wrap the queries as a subquery. 您可以将查询包装为子查询。 So means your SQL statement starts with the final results that you want, and you do that based on the result of the subquery. 因此,这意味着您的SQL语句以所需的最终结果开始,并且您将根据子查询的结果进行操作。

SELECT
    g.artID
FROM

    (SELECT 
       g.artID 
    FROM
       dbo.G_FID g
    INNER JOIN
       dbo.MasterData s
    ON
       g.WKN = s.WKN
    WHERE
       s.ID <> "US")

WHERE
    (g.FID='68A')
OR
    (g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))

you can use condition in join clausule... For example: 您可以在连接子句中使用条件...例如:

SELECT
    g.artID,

FROM dbo.G_FID g
JOIN dbo.MasterData s ON g.WKN = s.WKN AND 
                         s.ID <> 'US'
WHERE (g.FID='68A') OR
      (g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))

In other way you can also use temporary table like : 另外,您还可以使用临时表,例如:

IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp
SELECT
    g.artID,
    g.FID,
    g.VALUE
INTO #tmp
FROM dbo.G_FID g
JOIN dbo.MasterData s ON g.WKN = s.WKN
WHERE s.ID <> 'US'


SELECT
    g.artID
FROM
    #tmp g
WHERE
    (g.FID='68A')
OR
    (g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM