CREATE TABLE tmp(a INT,b int)
go
DECLARE @sql VARCHAR(10)SET @sql = ''SELECT @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name)
FROM syscolumns c
WHERE c.id = OBJECT_ID('tmp')
ORDER BY colid

SELECT @sql
/*
---------
,b(1 row(s) affected)*/

SET @sql = ''SELECT @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name)
FROM syscolumns c
WHERE c.id = OBJECT_ID('tmp')
--ORDER BY colid
SELECT @sql
/*
----------
,a,b(1 row(s) affected)
*/
GO
DROP TABLE tmp

解决方案 »

  1.   

    ORDER BY的问题据说2000里也有,,,
    select top 100 percent...
      

  2.   

    top   100   percent也没用,top   10000可以,,,
    CREATE TABLE tmp(a INT,b int)
    go
    DECLARE @sql VARCHAR(10)SET @sql = ''SELECT TOP 100 percent @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name)
    FROM syscolumns c
    WHERE c.id = OBJECT_ID('tmp')
    ORDER BY colid
        
    SELECT @sql
    /*
    ---------
    ,b(1 row(s) affected)*/
        
    SET @sql = ''SELECT TOP 10000 @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name)
    FROM syscolumns c
    WHERE c.id = OBJECT_ID('tmp')
    ORDER BY colid
    SELECT @sql
    /*
    ----------
    ,a,b(1 row(s) affected)
    */
    GO
    DROP TABLE tmp
      

  3.   


    ----------
    ,a,b(1 row(s) affected)
    ----------
    ,a,b(1 row(s) affected)
      

  4.   

    邹键有一篇文章专门论述这个问题:
    http://blog.csdn.net/zjcxc/archive/2006/09/17/1233068.aspx
      

  5.   


    CREATE TABLE tmp(a INT,b int)
    go
    DECLARE @sql VARCHAR(10)SET @sql = ''SELECT @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name)
    FROM syscolumns c
    WHERE c.id = OBJECT_ID('tmp')
    ORDER BY colid
        
    SELECT @sql
    /*
    ---------
    ,a,b(1 row(s) affected)*/
        
    SET @sql = ''SELECT @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name)
    FROM syscolumns c
    WHERE c.id = OBJECT_ID('tmp')
    --ORDER BY colid
    SELECT @sql
    /*
    ----------
    ,a,b(1 row(s) affected)
    */
    GO
    DROP TABLE tmp我这里的运行结果怎么和LZ的不一样?我这里得到的结果是一样的
      

  6.   

    如果只是SELECT CONVERT(VARCHAR(8000),c.name)
    FROM syscolumns c
    WHERE c.id = OBJECT_ID('tmp')
    ORDER BY colid
    那么无论是否有order by,返回都是正确的。
    但是使用  @sql = @sql + ',' + CONVERT(VARCHAR(8000),c.name) 就有问题了。不过我觉得上面这种写法也不是很好。完全依赖于SQL内部怎么处理...
      

  7.   

    请大家关注 SQL InjectionSQL Injection 是一种攻击方法,它可以将恶意代码插入到以后将传递给 SQL Server 供分析和执行的字符串中。任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQL Server 将执行其接收到的所有语法有效的查询。 SQL Injection 的主要形式包括直接将代码插入与 SQL 命令串联并执行的用户输入变量。一种间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串。在存储的字符串随后串连到一个动态 SQL 命令中时,将执行该恶意代码。 在帮助中提到如果可能,应拒绝包含以下字符的输入。输入字符  在 Transact-SQL 中的含义  
    ;
     查询分隔符
     
    '
     字符数据字符串分隔符
     
    -- 
     注释分隔符
     
    /* ... */
     注释分隔符。服务器不对 /* 和 */ 之间的注释进行处理。
     
    Xp_
     目录扩展存储过程的名称的开头,如 xp_cmdshell。