如何在MSSQL的存储过程中加入多个选择?

时间:2012-05-28 08:33:05

标签: sql-server tsql stored-procedures join

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

我目前拥有的是:

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

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

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

1 个答案:

答案 0 :(得分:2)

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

DECLARE @Query nvarchar

在此上下文中,根据the manual,最大长度默认为1

  

如果在数据定义或变量声明语句中未指定 n ,则默认长度为1 。如果未使用CAST函数指定 n ,则默认长度为30。

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

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

DECLARE @Query nvarchar(max)

在早期版本中,max不受支持,因此只需使用显式数字:

DECLARE @Query nvarchar(4000)