3

下面的代码应该采用一个可能是逗号分隔的字符串,也可能不是逗号分隔的字符串,并将其放入一个表(#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 等它工作得很好。

4

3 回答 3

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';
于 2012-10-22T23:25:06.213 回答
1

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

insert into tempdb..#TABLENAME

set @query = 'select * from tempdb..#TABLENAME'
于 2012-10-23T12:10:04.020 回答
1

好吧,在我上一个回答之后,我发现了几件事。当我查看您的程序时,您从“ BEGIN”开始,接下来您插入“ #tmpFullName”表,声明“ @Query”变量并创建一个 select 语句。

之后你做和“ END”之后的逻辑。你做了“ sp_executesql”,然后你删除了 temptable,然后你执行了当前过程。

结构不是那么可读,很抱歉告诉你。所以也许你先去那里。除了一个奇怪的结构之外,您#tmpFullName.Item在某些动态 SQL 中使用“”作为参数,而它是在 SQL 查询中声明的。所以你必须做这样的事情:

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

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

我实在是想不通了……

于 2012-10-29T07:08:58.523 回答