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