当前位置: 首页 > 面试题库 >

从存储过程中的动态SQL获取结果

贺靖
2023-03-14
问题内容

我正在编写一个存储过程,需要在该过程中动态构造一个SQL语句以引用传入的表名。

我需要让该SQL语句返回结果,然后可以在整个过程的其余部分中使用它。

我已经尝试过使用临时表和其他所有东西,但是我不断收到一条消息,我需要声明变量等。

例如:

DECLARE @FiscalYear INT    
DECLARE @DataSource NVARCHAR(25)
DECLARE @SQL NVARCHAR(250)
SELECT @DataSource = 'CustomerCosts20120328'
DECLARE @tempFiscalYear TABLE ( FiscalYear INT ) 
SELECT @SQL = 'INSERT INTO @tempFiscalYear SELECT DISTINCT FiscalYear FROM ' + @DataSource
EXEC(@SQL)
SELECT @FiscalYear = FiscalYear FROM @tempFiscalYear

或者…

DECLARE @FiscalYear INT  
DECLARE @DataSource NVARCHAR(25)
DECLARE @SQL NVARCHAR(250)
SELECT @DataSource = 'CustomerCosts20120328'
SELECT @SQL = 'SELECT DISTINCT @FiscalYear = FiscalYear FROM ' + @DataSource
EXEC(@SQL)

无论如何,有没有这样做而不使用实际表?

谢谢。


问题答案:

您是否尝试过类似的方法:

DECLARE @FiscalYear INT, @DataSource NVARCHAR(25), @SQL NVARCHAR(250);
SET @DataSource = N'CustomerCosts20120328';
SET @SQL = N'SELECT DISTINCT @FiscalYear = FiscalYear FROM ' + @DataSource;
EXEC sp_executesql @SQL, N'@FiscalYear INT OUTPUT', @FiscalYear OUTPUT;

PRINT @FiscalYear;

您需要确保将nvarchar字符串加N作为前缀,例如SELECT @SQL = N'SELECT ...

另外,您知道如果查询返回多行,则分配给@FiscalYear它的值是完全任意的,对吗?虽然您可能期望该表中有一个单一值,但使用MAX()TOP 1 ... ORDER BY确保仅分配一个可预测的值不会有什么坏处。



 类似资料:
  • 问题内容: 我正在尝试将旧的存储过程保存到字符串中。当我使用以下内容时,我不会出现任何换行符。 关于如何获取带有换行符的存储过程文本的任何建议? 我正在考虑使用 谢谢 更新 我正在复制并粘贴结果中的结果,这将显示给我一行。 至于脚本,因为我将结果存储在db字段中。我正在创建一个可以即时生成过程的工具,但是我想创建它们的历史记录。 更新 原来Object_definition可以满足我的要求,但是由

  • 问题内容: 我有一个具有应用程序角色的数据库。角色成员都属于Active Directory中的组。我没有给角色授予从表中进行选择的权限,而是给角色赋予了对它需要调用的所有存储过程的执行权限。 除了我的存储过程之一,该过程可以建立一些动态SQL并调用sp_executesql之外,其他方法都可以正常工作。 动态sql看起来像这样: 具有此角色的用户无法调用存储过程。它给出了以下错误,这是我所预期的

  • 问题内容: 我使用的是SQL Server2005。我创建了一个大多数时候都可以使用的存储过程,但是我发现了一个实例,它无法满足我的要求。 目前,代码执行的操作是这样的 输出变量在哪里。 因此,我可以得到一个数字,但我真正想要的只是SQL错误。 像 Hey之类的 东西 ,我不能这样做,因为在此列上有fk约束 或其他 约束 。我在msdn http://msdn.microsoft.com/zh-

  • 问题内容: 如何在MySQL存储过程中构建和使用动态SQL? 问题答案: 我不相信MySQL支持动态sql。您可以执行类似但不同的“准备”语句。 这是一个例子: 准备好的语句通常用于查看给定查询的执行计划。由于它们是使用 execute 命令执行的,并且可以将 sql 分配给变量,因此您可以近似地估计一些与动态sql相同的行为。 这是一个很好的链接: 不要忘记使用最后一行取消分配! 祝好运!

  • 本文向大家介绍在MySQL存储过程中实现动态SQL查询?,包括了在MySQL存储过程中实现动态SQL查询?的使用技巧和注意事项,需要的朋友参考一下 对于存储过程中的动态SQL查询,请使用PREPARE STATEMENT的概念。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是创建存储过程并实现动态SQL的查询- 调用存储

  • 问题内容: 我在存储过程中创建一个动态查询。我的存储过程如下: 当我尝试通过以下调用运行它时: 我收到以下错误消息: 错误代码:1054。“ where子句”中的未知列“ SPA” 我在没有where条件的情况下进行了测试,并且工作正常,但是在where条件不起作用的情况下,我尝试使用@和变量名一起使用,但仍然无法正常工作。 谢谢你的帮助。 问题答案: 您错过了条款中的引号。 尝试这样: 说明 :