Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何组合填充两个独立变量的两个大小写表达式?_Sql Server_Tsql_Variables_Case When - Fatal编程技术网

Sql server 如何组合填充两个独立变量的两个大小写表达式?

Sql server 如何组合填充两个独立变量的两个大小写表达式?,sql-server,tsql,variables,case-when,Sql Server,Tsql,Variables,Case When,我有一个存储过程,它接受用户输入,然后返回两个值。目前,我有两个case when表达式可以为我完成这项工作,但我正在尝试找出是否可以将这两个表达式组合起来,生成更简单、更整洁的代码 下面是我当前的案例 DECLARE @SpecialsVariable varchar(max) DECLARE @SpecialName varchar(64) SET @SpecialsVariable = CASE @Special WHEN 'Pet

我有一个存储过程,它接受用户输入,然后返回两个值。目前,我有两个
case when
表达式可以为我完成这项工作,但我正在尝试找出是否可以将这两个表达式组合起来,生成更简单、更整洁的代码

下面是我当前的
案例

DECLARE @SpecialsVariable varchar(max)
DECLARE @SpecialName varchar(64) 

SET @SpecialsVariable = CASE @Special
                           WHEN 'Petr_analysis' THEN 'RAW_ColloTel,RAW_DetroCol'
                           WHEN 'AFT_analysis' THEN 'RAW_Defo,RAW_Defr,RAW_Floo,RAW_Flor'
                           WHEN 'Fisch_analysis' THEN 'RAW_COke,RAW_Gas,RAW_H2O,RAW_Tar'
                        END

SET @SpecialName =  CASE @Special
                       WHEN 'Petr_analysis' THEN 'Petrography'
                       WHEN 'AFT_analysis' THEN 'Ash Fusion Temperature'
                       WHEN 'Fisch_analysis' THEN 'Fischer-Tropsch'
                    END
我尝试了下面的代码,但在两个集合变量之间的逗号方面出现了一个错误

DECLARE @Special varchar(64) = 'Petr_analysis'
DECLARE @SpecialsVariable varchar(max)
DECLARE @SpecialName varchar(64) 

set @SpecialName, @SpecialsVariable =  case @Special
    when 'Petr_analysis' then 'Petrography', 'RAW_ColloTel,RAW_DetroCol'
    when 'AFT_analysis' then 'Ash Fusion Temperature', 'RAW_Defo,RAW_Defr,RAW_Floo,RAW_Flor'
    when 'Fisch_analysis' then 'Fischer-Tropsch', 'RAW_COke,RAW_Gas,RAW_H2O,RAW_Tar'
end
提前谢谢你

不,不行。
case
表达式只能为每个条件返回标量值

但是,您可以使用表并使用select语句填充变量:

CREATE TABLE SpecialMapping -- Find a better name for this, please
(
    Special varchar(64),
    Name varchar(64), 
    Variable varchar(max) -- Do you really need max here? 
)

INSERT INTO SpecialMapping (Sepcial, Name, Variable) VALUES
('Petr_analysis', 'Petrography', 'RAW_ColloTel,RAW_DetroCol'),
('AFT_analysis', 'Ash Fusion Temperature', 'RAW_Defo,RAW_Defr,RAW_Floo,RAW_Flor'),
('Fisch_analysis', 'Fischer-Tropsch', 'RAW_COke,RAW_Gas,RAW_H2O,RAW_Tar');

在存储过程中:

SELECT @SpecialName = Name
     , @SpecialsVariable = Variable 
FROM SpecialMapping
WHERE WHERE Special = @Special;

我不相信你能那样把它们结合起来

我认为你的选择是正确的

  • 独立设置变量,就像第一个块一样
  • 嵌套的if语句
  • 创建一个引用表
嵌套if的示例

IF @Special = 'Petr_analysis' 
    BEGIN 
    (set your variables) 
    END 
ELSE IF @Special = 'AFT_analysis'
    BEGIN
    ...
带有三列的参考表示例,例如Special、SpecialVariable、SpecialName

SELECT  @SpecialVariable = yt.SpecialVariable, 
        @SpecialName = yt.SpecialName 
FROM    yourtable yt 
WHERE   yt.Special = @Special

如果这是一种一次性需求,另一种选择可能是使用表值构造函数:

e、 g:

有关表值构造函数的信息:


当前使用的是varchar(max),因为我还没有确定最佳长度大小。对于这个问题,我缩短了一些@SpecialsVariable values.BTW,您真的不应该在SQL中使用分隔字符串。()
DECLARE @SpecialsVariable varchar(max)
DECLARE @SpecialName varchar(64) 
DECLARE @Special varchar(30) =  'Petr_analysis'

select @SpecialsVariable = tab.Variable, @SpecialName = tab.Name from
    (VALUES 
         ('Petr_analysis', 'RAW_ColloTel,RAW_DetroCol',  'Petrography'),
         ('AFT_analysis', 'RAW_Defo,RAW_Defr,RAW_Floo,RAW_Flor', 'Ash Fusion Temperature'),
         ('Fisch_analysis', 'RAW_COke,RAW_Gas,RAW_H2O,RAW_Tar', 'Fischer-Tropsch')         
    ) tab (Special, Variable, Name) 
    where tab.Special = @Special