1

我有这个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)

和错误消息:

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

任何人都知道这件事是怎么回事谢谢

4

2 回答 2

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 
于 2013-02-14T14:20:51.393 回答
0

你的#temp表有标识列,你的查询只插入到#temp表中一次。所以你只有ID = 1. ID = 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
于 2013-02-14T14:16:39.763 回答