我有这个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'.
任何人都知道这件事发生了什么,谢谢
答案 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 = 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