【问题标题】:Assign a sql script into a variable将 sql 脚本赋值给变量
【发布时间】:2018-11-30 23:46:29
【问题描述】:

这是我第一次这样做,原因是我想避免在使用条件“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 St​​atus=2 group by 1 asc" 。我需要的是从该脚本中获取表格数据

【问题讨论】:

  • 只是确保;你在使用 SQL Server 吗?
  • 是的,我正在使用 Microsoft SQL Server Management Studio

标签: sql


【解决方案1】:

您需要使用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)

使用sp_executesql。请注意,您不能使用 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

【讨论】:

  • +1 用于更正脚本。虽然,出于此处列出的原因,我建议他们使用 sp_executesql 而不仅仅是 exec:blogs.msdn.microsoft.com/turgays/2013/09/17/…
  • 这一切都假设他们正在使用 SQL Server :)
  • @StuartAinsworth 我将为这两种解决方案更新脚本。感谢您仔细检查。
【解决方案2】:

随便用

执行 sp_executesql @SQLScript

执行查询

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2016-09-15
    相关资源
    最近更新 更多