【问题标题】:How to join multiple selects in a stored procedure with MSSQL?如何使用 MSSQL 在存储过程中加入多个选择?
【发布时间】:2012-06-02 15:22:22
【问题描述】:

我有一个包含动态生成表的数据库。我正在编写一个存储过程来对生成的表执行查询,我需要在查询分析器工具(或类似工具)中查看结果。

我目前拥有的是:

DECLARE @TableName sysname

DECLARE TableNameCursor CURSOR FOR
SELECT TableName FROM [xxxTables] WHERE xxx...

OPEN TableNameCursor
FETCH NEXT FROM TableNameCursor INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE @Query nvarchar
    SET @Query = 'SELECT * FROM ' + @TableName
    EXEC sp_executesql @Query

    -- This is executed as long as the previous fetch succeeds.
    FETCH NEXT FROM TableNameCursor INTO @TableName
END

但由于我有多个选择,我没有得到输出。如何修复存储过程以显示结果?

所有表格的布局都相同,所以我可以加入它们。

【问题讨论】:

  • '所有表格的布局都相同,所以我可以加入它们。' - 你真的是说 UNION他们?
  • 我的意思是我可以将输出创建为单个表
  • 好的。你到底在哪里没有得到输出(我的意思是,它是在客户端应用程序中还是在另一个存储过程中,或者......)? SP 是如何调用的?
  • 我直接在查询分析器上调用该过程,我根本没有得到任何输出。
  • 糟糕,您确实在问题中提到了查询分析器,但我错过了,抱歉。也许,查询分析器不支持显示单个存储过程返回的多个结果集。如果该过程确实产生了多个结果,我相信如果您在 SSMS 查询窗口中运行 SP,您将能够看到它们。不过,我不确定您是否认为该工具相似

标签: sql-server tsql stored-procedures join


【解决方案1】:

除非这只是在此处发布脚本时产生的拼写错误,否则我可能终于找到了问题所在。您尚未指定 @Query 变量的最大长度:

DECLARE @Query nvarchar

在这种情况下,最大长度默认为1,根据the manual

n在数据定义或变量声明语句中未指定时,默认长度为1。当n没有用CAST函数指定时,默认长度为30。

当您将查询字符串分配给@Query 时,它只存储第一个字符。自然,当您稍后尝试执行查询时,它不会返回任何内容,而是会产生错误。

您可以通过指定最大长度来修复它。在 SQL Server 2005 或更高版本中,它可以是显式数字(最多 4000)或max

DECLARE @Query nvarchar(max)

在早期版本中不支持max,因此只需使用明确的数字:

DECLARE @Query nvarchar(4000)

【讨论】:

  • 谢谢! :) 这就是问题所在,你拯救了我的一天 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 2021-01-19
相关资源
最近更新 更多