我有一个动态生成表的数据库。我正在编写一个存储过程来对生成的表执行查询,我需要在查询分析器工具(或类似的)中查看结果。
我目前拥有的是:
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
但是由于我有多个选择,我没有得到输出。如何修复存储过程以显示结果?
所有表格都有相同的布局,所以我可以加入它们。
答案 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)