Sql 是否可以在变量中设置select语句的一部分

Sql 是否可以在变量中设置select语句的一部分,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个查询,select-部分非常长。我想把它分成几个部分,特别是因为有些部分在里面有两次甚至更多次 我想要的是如下内容: Declare @SQLPart as varchar(1000) Set @SQLPart = 'Field1, case ... as Field2,' Select ..., @SQLPart, ... From ..... 不幸的是,这会导致错误消息。我也尝试了类似于EXEC(@SQLPart)的方法,但当然这也不起作用。如何解

我有一个查询,
select
-部分非常长。我想把它分成几个部分,特别是因为有些部分在里面有两次甚至更多次

我想要的是如下内容:

Declare @SQLPart as varchar(1000)
Set @SQLPart = 'Field1,
                case ... as Field2,'

Select ..., @SQLPart, ... From .....

不幸的是,这会导致错误消息。我也尝试了类似于
EXEC(@SQLPart)
的方法,但当然这也不起作用。如何解决这个问题?

您可以在此处使用动态sql,并使用
EXECUTE
关键字执行此动态查询

Declare @SQLPart as varchar(1000)
Set @SQLPart = 'Field1,
                case ... as Field2,'

EXECUTE ('SELECT ....,'+@SQLPart+',... FROM ...')

SQL Server不支持宏替换,因此必须使用动态SQL

Declare @SQL varchar(max) ='Select ... ' + @SQLPart + '... from ...'
Exec(@SQL)
是,动态sql和:

您的SQL代码必须是
nvarchar
类型。
同样,sp_executesql优于
executesql
函数,当您有许多类似的查询时,
sp_executesql
缓存执行计划,并且性能会更好。

您应该使用
mssql动态sql
使用“EXEC”不是首选。最好使用Backs提供的答案,它使用
sp\u executesql
。这是因为
EXECUTE
EXEC
允许SQL注入,以防字段包含客户输入的某种形式的查询。在这种情况下,我们的数据库/数据可能会受到来自外国来源的攻击。因此建议使用
sp_executesql
。使用“EXEC”不是首选。最好使用Backs提供的答案,它使用
sp\u executesql
。这是因为
EXECUTE
EXEC
允许SQL注入,以防字段包含客户输入的某种形式的查询。在这种情况下,我们的数据库/数据可能会受到来自外国来源的攻击。因此,建议使用
sp_executesql
。@Grafit您能接受我的回答吗?或者您需要一些意见吗?
CREATE TABLE ##Temp (Field1 int, Field2 int)

Declare @SQLPart nvarchar(1000)
Set @SQLPart = N'Field1, Field2 '

DECLARE @SQL nvarchar(1000) = N'SELECT ' + @SQLPart + 'FROM ##Temp'
PRINT @SQL

EXEC sp_executesql @SQL

DROP TABLE ##Temp