Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 MS SQL Server:为变量赋值并在查询中重用变量_Sql Server_Variables_Select - Fatal编程技术网

Sql server MS SQL Server:为变量赋值并在查询中重用变量

Sql server MS SQL Server:为变量赋值并在查询中重用变量,sql-server,variables,select,Sql Server,Variables,Select,我正在做以下工作,例如: SELECT name1, name2, left(name1,2) + '_' + left(name2,2), ID, ID + left(name1,2) + '_' + left(name2,2) from person 所以left(name1,2)+''+left(name2,2)被多次使用。我有没有办法做得更好。我有查询,我必须调用相同的功能链10-15次 其他例子: 我需要使用子查询获取一些查询值 e、 g 在某些情况下,我还需要从不同列的子查询返回

我正在做以下工作,例如:

SELECT name1, name2, left(name1,2) + '_' + left(name2,2), ID, ID + left(name1,2) + '_' + left(name2,2)

from person
所以
left(name1,2)+''+left(name2,2)
被多次使用。我有没有办法做得更好。我有查询,我必须调用相同的功能链10-15次

其他例子:

我需要使用子查询获取一些查询值

e、 g

在某些情况下,我还需要从不同列的子查询返回的值

e、 g


必须有一种更简单的方法…对吗?

您可以使用外部应用来重用代码,如下所示:

Select p.name, x.something, p.age, left(x.something,2) as Test
from person p
outer apply (
    Select something from some_table s where s.X=p.Y
) x

嗯,有点乱是的。但是SQL Server不会执行子选择两次。通常情况下,他会决定两个子选择返回相同的结果,并对两个操作重复使用结果。您可以将SELECT包装在CTE中,并提供语音别名。在你的第一个例子中,似乎你的表结构才是真正的问题。但如果您发现自己需要使用列的连接部分,您可以查看计算列。这使得这类事情更容易处理。
Select name, (Select something from some_table where X=Y) , age,
left( (Select something from some_table where X=Y),2) as Test

from person
Select p.name, x.something, p.age, left(x.something,2) as Test
from person p
outer apply (
    Select something from some_table s where s.X=p.Y
) x