无法绑定多部分标识符“#tmpFullname.Item”。“

时间:2012-10-22 23:12:00

标签: tsql stored-procedures

以下代码应该采用一个字符串,该字符串可能以逗号分隔,也可能不以逗号分隔,并将其放入表(#tmpFullanme)中,该部分可以正常工作。第二部分假设根据输入内容返回所有与LIKE / NOT LIKE相关的值,包括或不包含%符号。我得到的错误是“多部分标识符”#tmpFullname.Item“无法绑定”。我最好的猜测是它可能超出范围?

DROP PROCEDURE uspJudgments; 
GO 
CREATE PROCEDURE uspJudgments 
@fullName varchar(100), @SrchCriteria1 varchar(15), @SrchCriteria2 varchar(15), @qualifier varchar(10) 
AS 
BEGIN 

SELECT * 
INTO #tmpFullname 
FROM dbo.DelimitedSplit8K(@fullName, ',') 

DECLARE @Query NVarChar(1024) 
SET @Query = 'SELECT d.*' + ' FROM defendants_ALL d, #tmpFullname' + 
' WHERE d.combined_name' + ' ' + @qualifier + ' ' + '''' + @SrchCriteria1 + '''' + ' + ' + '''' + #tmpFullname.Item + '''' + ' + ' + '''' + @SrchCriteria2 + '''' 

END 

EXEC sp_executesql @Query 
PRINT(@Query) 

IF OBJECT_ID('#tmpFullname', 'U') IS NOT NULL 
DROP TABLE #tmpFullname 

EXEC uspJudgments @qualifier = 'LIKE', @fullName = 'johnson', @SrchCriteria1 = '%', @SrchCriteria2 = '%'

无法到达PRINT输出,因为“多部分标识符”#tmpFullname.Item“无法绑定”。如果我将#tmpFullname.Item更改为'#tmpFullname.Item它会通过并返回任何内容,但它显示查询是正确的,减去该表的问题。

SELECT d.* FROM defendants_ALL d, #tmpFullname WHERE d.combined_name LIKE '%' + '#tmpFullname.Item' + '%'

请注意,在我将其转换为动态查询之前,我可以将语句从LIKE更改为IN等,它的效果非常好。

3 个答案:

答案 0 :(得分:5)

我设置了一个完整的测试,以获得正确的脚本,以获得您想要的结果。我还有一个SQL Fiddle展示了它是如何工作的。 注意您需要在存储过程

中运行EXECUTE sp_executesql @Query
ALTER PROCEDURE uspJudgments @fullName varchar(100)
   , @SrchCriteria1 varchar(15)
   , @SrchCriteria2 varchar(15)
   , @qualifier varchar(10) 
AS 
BEGIN 

   --Simulates your split function
   SELECT *
   INTO #tmpFullName
   FROM
   (
     SELECT 'firstTest' AS Item
     UNION ALL SELECT 'secondTest'
     UNION ALL SELECT 'NotThere'
   ) AS t;

   DECLARE @Query NVARCHAR(1024);
   SELECT @Query = 'SELECT d.* '
      + ' FROM defendants_ALL d '
      + ' CROSS JOIN #tmpFullName AS t '
      + ' WHERE d.combined_name' + ' ' + @qualifier + ' '
      + '''' + @SrchCriteria1 + ''''
      + ' + ' + 't.Item' + ' + ' + '''' + @SrchCriteria2 + '''';

   EXECUTE sp_executesql @Query;

END

EXECUTE uspJudgments
@fullName = 'does not matter'
   , @SrchCriteria1 = '%'
   , @SrchCriteria2 = '%'
   , @qualifier = 'LIKE';

答案 1 :(得分:1)

在这种情况下你必须使用tempdb前缀

insert into tempdb..#TABLENAME

set @query = 'select * from tempdb..#TABLENAME'

答案 2 :(得分:1)

好吧,在我的最后一个回答后,我找到了几件事...... 当我查看您的过程时,您将从“BEGIN”开始,然后在“#tmpFullName”表中插入,您声明“@Query”变量并创建一个select语句

之后你会用“END”跟随逻辑。在你删除了temptable并执行当前程序的执行后,你执行“sp_executesql”。

结构并非完全可读,很遗憾地告诉你。所以也许你先去那儿。 除了一个奇怪的结构,你在一些动态SQL中使用“#tmpFullName.Item”作为参数,而它在SQL查询中自己声明。所以你必须做这样的事情:

SET @Query = 'SELECT d.*' + ' FROM defendants_ALL d, #tmpFullname' + 
  ' WHERE d.combined_name' + ' ' + @qualifier + ' ' + '''' + @SrchCriteria1 + '''' + ' + ' + ' #tmpFullname.Item ' + ' + ' + '''' + @SrchCriteria2 + '''' 

#tmpFullName.Item”所在的位置是代码,而不是参数。但话又说回来,你想在这里实现什么目标?要完全回答这个问题,我们必须知道其他变量是什么。你的结构并没有告诉我想要实现的目标......

我真的不能再做了...