none
怎么输出 存储过程最终要执行的SQL语句,以便调试 RRS feed

  • 问题

  •     在动态sql中,我设置了一个@sql nvarchar(max),想检测一下输出的语句是否合符我的要求,再用 exec(@sql)执行。

        但用print @sql输出远远不够长,不知道该怎么调试了!

        请帮忙看看,3q


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年8月28日 9:58

答案

  • 您好,
    可以分段print
    請參考以下的link,

    How to print VARCHAR(MAX) using Print Statement?

    類似以下的做法,請參考,

    create PROC TestMaxString 
    AS
    begin
    	DECLARE @maxString varchar(MAX);
    	SET @maxString = '';
    	DECLARE @i INT;
    	SET @i = 0;
    	WHILE @i < 100
    	BEGIN
    		SET @maxString = @maxString + REPLICATE(LTRIM(STR(@i)), 1000) + CHAR(13);
    		SET @i = @i + 1;
    	END;  
    	--沒辦法完全print出來
    	--PRINT @maxString;
    
    	--只好分段print
    	DECLARE @Counter INT
    	SET @Counter = 0
    	DECLARE @TotalPrints INT
    	SET @TotalPrints = (LEN(@maxString) / 8000) + 1;
        
    	WHILE @Counter < @TotalPrints 
    	BEGIN
    		PRINT SUBSTRING(@maxString, @Counter * 8000 + 1 ,LEN(@maxString) - @Counter * 8000 );
    		SET @Counter = @Counter + 1
    	END
    
    end


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2013年8月28日 10:15
  • LZ你在消息窗口里,ctrl+A全选 print出来的sql,然后复制粘贴到txt或者word里看不可以吗?

    2013年8月28日 11:28
  • select @sql 就可以了, 2012 的 ssms 可以 Copy 出换行的结果

    之前版本的 ssms, 你可以用另存为文件的方法来查看结果

    2013年8月28日 11:42

全部回复

  • 您好,
    可以分段print
    請參考以下的link,

    How to print VARCHAR(MAX) using Print Statement?

    類似以下的做法,請參考,

    create PROC TestMaxString 
    AS
    begin
    	DECLARE @maxString varchar(MAX);
    	SET @maxString = '';
    	DECLARE @i INT;
    	SET @i = 0;
    	WHILE @i < 100
    	BEGIN
    		SET @maxString = @maxString + REPLICATE(LTRIM(STR(@i)), 1000) + CHAR(13);
    		SET @i = @i + 1;
    	END;  
    	--沒辦法完全print出來
    	--PRINT @maxString;
    
    	--只好分段print
    	DECLARE @Counter INT
    	SET @Counter = 0
    	DECLARE @TotalPrints INT
    	SET @TotalPrints = (LEN(@maxString) / 8000) + 1;
        
    	WHILE @Counter < @TotalPrints 
    	BEGIN
    		PRINT SUBSTRING(@maxString, @Counter * 8000 + 1 ,LEN(@maxString) - @Counter * 8000 );
    		SET @Counter = @Counter + 1
    	END
    
    end


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2013年8月28日 10:15
  • LZ你在消息窗口里,ctrl+A全选 print出来的sql,然后复制粘贴到txt或者word里看不可以吗?

    2013年8月28日 11:28
  • select @sql 就可以了, 2012 的 ssms 可以 Copy 出换行的结果

    之前版本的 ssms, 你可以用另存为文件的方法来查看结果

    2013年8月28日 11:42
  • 用select @sql的方法,如果sql语句很长也是不方便查看

    复制粘贴出来或者另存为文件就可以了

    2013年8月28日 12:00
  • select其實也有長度限制.
    分段試過好用,有一的小問題,每次print執行時會自動換行,造成產出的t-sql 會出錯  須手動調整
    2015年4月1日 6:24