Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 - Fatal编程技术网

Sql server 如何在不重复子句的情况下分配多个变量

Sql server 如何在不重复子句的情况下分配多个变量,sql-server,tsql,Sql Server,Tsql,我有大约10个变量,它们都需要在select语句中填充 它都是由语言代码驱动的,如果“english”将所有变量设置为english,否则设置为native language 我遇到的问题是大量重复代码,我想知道在一个案例中填充多个变量的最佳方法是什么 我当前的代码 DECLARE @x nvarchar(200), @y nvarchar(200), @z nvarchar(200) SELECT @x = CASE WHEN @language like '%english%'

我有大约10个变量,它们都需要在select语句中填充

它都是由语言代码驱动的,如果“english”将所有变量设置为english,否则设置为native language

我遇到的问题是大量重复代码,我想知道在一个案例中填充多个变量的最佳方法是什么

我当前的代码

DECLARE
@x nvarchar(200),
@y nvarchar(200),
@z nvarchar(200)

SELECT
    @x = CASE WHEN @language like '%english%'
            THEN                                        
                T.washroom_English
            ELSE                                            
                T.washroom
        END,
    @y = CASE WHEN @language like '%english%'
            THEN                                        
                T.bed_English
            ELSE                                            
                T.bed
        END,
    @z = CASE WHEN @language like '%english%'
            THEN                                        
                T.kitchen_English
            ELSE                                            
                T.kithen
        END
FROM house as T
试试我的小把戏

DECLARE @English NVARCHAR(10) = '_English'
DECLARE @Fields NVARCHAR(500) = 'washroom,bed,kithen,'
DECLARE @TableName NVARCHAR(50) = 'house'
DECLARE @ColumnValue NVARCHAR(100)
DECLARE @Index INT
DECLARE @SelectString NVARCHAR(4000) = 'SELECT ' 
 WHILE CHARINDEX(',', @Fields) > 0
 BEGIN
    SELECT @Index  = CHARINDEX(',', @Fields)  
    SELECT @ColumnValue = SUBSTRING(@Fields, 1, @Index-1)
    SET @SelectString = @SelectString + '''' + @ColumnValue + @English +'''As ' + @ColumnValue + ', '
    SELECT @Fields = SUBSTRING(@Fields, @Index + 1, LEN(@Fields) - @Index)
 END
SELECT @SelectString = SUBSTRING(@SelectString,0, LEN(@SelectString)) + ' From ' + @TableName
SELECT @SelectString  
EXEc sp_sqlexec @SelectString

我不知道我是否理解正确,但我的建议是:

DECLARE
@x nvarchar(200),
@y nvarchar(200),
@z nvarchar(200)

IF @language like '%english%'
    SELECT @x = T.washroom_English, @y = T.bed_English, @z = T.kitchen_English FROM house as T
ELSE
    SELECT @x = T.washroom, @y = T.bed, @z = T.kitchen FROM house as T

您可以使用一个查询,该查询将根据@language变量按语言(英语或非英语)生成行。
UNION ALL
结果的列名称与上面的查询相同

然后可以从子查询中使用静态列名分配变量

  SELECT @x = washroom
       , @y = bed
       , @z = kitchen
FROM   ( SELECT T.washroom
              , T.bed
              , T.kitchen
         FROM   house AS T
         WHERE  @language NOT LIKE '%english%'
         UNION ALL
         SELECT T.washroom_English
              , T.bed_English
              , T.kitchen_English
         FROM   house AS T
         WHERE  @language LIKE '%english%' 
       ) data 

我想说的是,最好的方法是尝试去规范化数据:每种语言有一条记录,并在查询中使用这种语言,或者将字符串值提取到一个单独的实体中,这在查询性能方面更差。想象一下,一年后,有人来找你说“我们的项目正在扩展,现在我们需要支持15种其他语言”,想象一下这样实现它是多么有趣:)@Phoenix,不清楚你为什么希望每个列的值都包含在一个变量中;你在拿这些车干什么?