Sql server 如何在不重复子句的情况下分配多个变量
我有大约10个变量,它们都需要在select语句中填充 它都是由语言代码驱动的,如果“english”将所有变量设置为english,否则设置为native language 我遇到的问题是大量重复代码,我想知道在一个案例中填充多个变量的最佳方法是什么 我当前的代码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%'
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,不清楚你为什么希望每个列的值都包含在一个变量中;你在拿这些车干什么?