我有一个查询select
- 部分真的很长。我想将它分成几部分,特别是因为有些部分存在两次甚至更多。
我喜欢的内容如下:
Declare @SQLPart as varchar(1000)
Set @SQLPart = 'Field1,
case ... as Field2,'
Select ..., @SQLPart, ... From .....
不幸的是,这会导致错误消息。我尝试了类似EXEC(@SQLPart)
的东西,但当然这也没有用。我该如何解决这个问题?
答案 0 :(得分:4)
是的,动态sql和sp_executesql
:
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
您的SQL代码必须是nvarchar
类型。
如果您有许多类似的查询,则sp_executesql
优于EXECUTE
函数,sp_executesql
缓存执行计划,并且性能更佳。
答案 1 :(得分:2)
您可以在此处使用动态sql,并使用EXECUTE
关键字来执行此动态查询
Declare @SQLPart as varchar(1000)
Set @SQLPart = 'Field1,
case ... as Field2,'
EXECUTE ('SELECT ....,'+@SQLPart+',... FROM ...')
答案 2 :(得分:2)
SQL Server不支持宏替换,因此您必须使用动态SQL。
Declare @SQL varchar(max) ='Select ... ' + @SQLPart + '... from ...'
Exec(@SQL)