将动态列名传递给临时表不起作用?

时间:2013-02-14 14:05:49

标签: sql sql-server sql-server-2008 sql-server-2005

我有这个Sql难题我正在使用Sql server 2005

以下查询正常

 DECLARE @query VARCHAR(200)
 DECLARE @colname varchar(50) 
     CREATE TABLE #temp (ID INT IDENTITY PRIMARY KEY , value VARCHAR(50))
       INSERT INTO #temp VALUES ('first')
       SET @colname = 'myCol'
       SET @query = 'SELECT value AS' + @colname + ' FROM #temp'
        EXEC(@query)
     DROP TABLE #temp

但是

如果我这样做

  SET @colname = (SELECT value FROM tablename WHERE id = 12) --valid selection 

  SELECT @colname = value FROM tablename WHERE id = 12 --valid selection 

我没有得到任何结果,我收到一条消息说:

  (1 row(s) affected)

AND ERROR消息:

  Msg 102, Level 15, State 1, Line 1
  Incorrect syntax near '1'.

任何人都知道这件事发生了什么,谢谢

2 个答案:

答案 0 :(得分:2)

根据评论,您需要防范值NULL,因为没有分配任何内容或列名是无效的SQL Server标识符。

您可以通过在分配后检查@@ROWCOUNT来完成前者,使用QUOTENAME检查第二个

DECLARE @query VARCHAR(200)
DECLARE @colname VARCHAR(50)

CREATE TABLE #temp
  (
     ID    INT IDENTITY PRIMARY KEY,
     value VARCHAR(50)
  )

INSERT INTO #temp
VALUES      ('first')

SELECT @colname = QUOTENAME(value)
FROM   tablename
WHERE  id = 12

IF @@ROWCOUNT <> 1
  BEGIN
      RAISERROR('Unexpected rowcount',16,1)

      RETURN
  END

SET @query = 'SELECT value AS ' + @colname + ' FROM #temp'

EXEC(@query)

DROP TABLE #temp 

答案 1 :(得分:0)

您的#temp表有标识列,您的查询只会插入#temp表一次.. 所以你只有ID = 1ID = 12不存在。

此查询将提供结果。

 DECLARE @query VARCHAR(200)
 DECLARE @colname varchar(50) 
 CREATE TABLE #temp (ID INT IDENTITY PRIMARY KEY , value VARCHAR(50))
       INSERT INTO #temp VALUES ('first')
       SELECT @colname = value FROM #temp WHERE id = 1
       SET @query = 'SELECT value AS' + @colname + ' FROM #temp'
        EXEC(@query)
 DROP TABLE #temp