以下代码应该采用一个字符串,该字符串可能以逗号分隔,也可能不以逗号分隔,并将其放入表(#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等,它的效果非常好。
答案 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
”所在的位置是代码,而不是参数。但话又说回来,你想在这里实现什么目标?要完全回答这个问题,我们必须知道其他变量是什么。你的结构并没有告诉我想要实现的目标......
我真的不能再做了...