这是我第一次这样做,原因是我希望在使用条件"if"时避免键入相同的sql脚本代码。我的第一个选择是创建一个变量并将"select"语句分配给它,现在取决于另一个变量值,我只会更改"where"条件,但我不会得到常规sql脚本上得到的所有列和行,而是只得到一个单元格,其中的文本分配给了变量。以下是我的代码:
DECLARE @SQLScript varchar(MAX)='' ,
@Subordinate int = 1;
SELECT @SQLScript = N'SELECT * FROM Account
WHERE AccountID = 345015'
IF @Subordinate = 1
BEGIN
SELECT @SQLScript =@SQLScript +' AND Status=2 ORDER BY 1 asc'
END
ELSE
BEGIN
SELECT @SQLScript =@SQLScript +' AND Status=1 ORDER BY 2 asc'
END
SELECT @SQLScript
执行上述脚本后,我得到的是1个单元格,显示以下文本"SELECT*Account where AccountID=345015 AND Status=2 group by 1 asc"。我需要的是从脚本中获取表数据
只需使用EXEC()
即可执行动态脚本。此外,您还需要将FROM放入您的选择中,使用ORDER BY
而不是GROUP BY
来排序查询。她是你的更正脚本:
使用EXEC()
:
Declare
@SQLScript varchar(max)=''
,@Subordinate int = 1;
Select @SQLScript = N'SELECT * FROM Account
where AccountID = 345015'
if @Subordinate = 1
begin
Select @SQLScript =@SQLScript +' AND Status=2 order by 1 asc'
end
else
begin
Select @SQLScript =@SQLScript +' AND Status=1 order by 2 asc'
end
--select @SQLScript
exec(@SQLScript)
使用CCD_ 5。请注意,不能使用VARCHAR
来使用sp_executesql
执行查询。必须使用NVARCHAR
(或ntext
、nchar
(。
Declare
@SQLScript NVARCHAR(max)=''
,@Subordinate int = 1;
Select @SQLScript = N'SELECT * FROM Account
where AccountID = 345015'
if @Subordinate = 1
begin
Select @SQLScript =@SQLScript +' AND Status=2 order by 1 asc'
end
else
begin
Select @SQLScript =@SQLScript +' AND Status=1 order by 2 asc'
end
--select @SQLScript
EXECUTE sp_executesql @SQLScript
只需使用
执行sp_executesql@SQLScript
执行查询