Sql server 无效的列名";用户“来源”;

Sql server 无效的列名";用户“来源”;,sql-server,sql-server-2008,ssrs-2008,reporting-services,Sql Server,Sql Server 2008,Ssrs 2008,Reporting Services,我有一个存储过程,它在xml@Data输出参数中返回一个结果 在xml代码中分配数据是非常困难的 SELECT @data= ( SELECT DISTINCT CONVERT(varchar(2),u.USER_SOURCE ) + '~' + CONVERT(varchar(20), u.[USER_ID]) + '-' + CONVERT(varchar(10), u.DEALER_ID) as USER_DEALER_ID

我有一个存储过程,它在xml
@Data
输出参数中返回一个结果

在xml代码中分配数据是非常困难的

SELECT @data= (
    SELECT DISTINCT 
        CONVERT(varchar(2),u.USER_SOURCE ) + '~' + 
        CONVERT(varchar(20), u.[USER_ID]) + '-' +
        CONVERT(varchar(10), u.DEALER_ID) as USER_DEALER_ID
    FROM #users u FOR XML RAW('users')) 
在SQLServerMgmtStudio中执行该过程时,可以看到结果OK

此过程是从另一个过程调用的,父过程用于SSRS

在SSRS中,我遇到了错误

数据集“DataSet1”的查询执行失败。无效的列名 “用户源”。列名“USER\u ID”无效。无效的列名 “经销商ID”

你能帮忙吗

谢谢,
Chetan

这是一个脚本,我认为它再现了与您相同的问题:

CREATE PROCEDURE TestTmpTable
  @value varchar(20)
AS
BEGIN
  CREATE TABLE #test (id int IDENTITY, value varchar(20));
  INSERT INTO #test (value) VALUES (@value)
  SELECT * FROM #test;
  DROP TABLE #test;
END

GO

CREATE TABLE #test (id int IDENTITY, value2 varchar(20));
EXEC TestTmpTable 'some text';
SELECT * FROM #test;
DROP TABLE #test;

GO

DROP PROCEDURE TestTmpTable
如您所见,这里有两个
#test
表,一个在存储过程中创建,另一个在调用存储过程的批处理中创建。它们有不同的结构:一个列名为
value
,另一个列名为
value2
。如果运行脚本,将看到以下错误:

Msg 207, Level 16, State 1, Procedure TestTmpTable, Line 6
Invalid column name 'value'.
目前我无法向您介绍相关的文档文章,但对我来说,很明显,在执行SP之前,正在进行一些初步的名称检查。在该阶段,存储过程中引用的列名与已经存在的表中实际存在的列名之间存在差异,这导致无法执行

如果将
value2
更改为
value
,脚本将正常工作,并且输出中将有两个行集,一个带有
“某些文本”
值,另一个为空。当然,如果删除与外部
#test
表相关的所有部分,脚本将正常工作


所以,请检查调用您的过程的位置,查看此时是否存在任何其他
#用户
表,如果存在,请根据您的情况修改此问题。

是否可以发布调用存储过程的代码?如果我从sql server management studio运行此过程,然后仅刷新SSRS中的数据集,问题得到解决。感谢Amar,我添加了有问题的过程代码,可能是创建的临时表导致了此问题。请在列名和表名之间加上方括号,更加一致。感谢Andrey的详细解释。我会看看我的两个程序,它对我来说都很有效。我有两个表#用户一个在父进程中,一个在子进程中。我从子过程中重命名了一个,它对我有效。再次感谢各位:D@Chetan:我的荣幸!谢谢你回来报道!