select 在 sp 中查询 returns 为空,但当 运行 单独查询时,它不是空的。为什么?
select query returns empty in sp but when run it alone, it is not empty. Why?
我有一个写入 Table 并读取 table 的存储过程。我写没有问题,但是当我想阅读它时 returns 是空的。但是当我 select 查询并且 运行 它 returns 数据时它不是空的。为什么可以。
这是我的代码。我将全文索引 Dump 和 TempTable 赋给标签、标题和 body 列。
IF LEFT(@splitdata,1) = '#'
BEGIN
SET @splitdata = (SELECT REPLACE(@splitdata,'#',''))
INSERT INTO [WebTR].[dbo].[TempTable]
SELECT p.*
FROM [WebTR].[dbo].[Dump] AS p
INNER JOIN containstable([WebTR].[dbo].[Dump], tags, @splitdata) AS k
ON p.dumpID = k.[key]
end
SET @replacedLast += @replaced2
FETCH NEXT FROM TableA_cursor INTO @row
我先插入温度table然后
IF EXISTS(SELECT * FROM WebTR.dbo.TempTable)
BEGIN
SELECT @replacedLast AS withtag
select dumpId,title,source,tags,creationdate,status,body,createdBy,max(rank) as rank,'olsanaaa' AS sinir
from
((SELECT p.*, k.rank
FROM WebTR.dbo.TempTable AS p
INNER JOIN containstable(WebTR.dbo.TempTable, title,'"*cunku*"' ) AS k
ON p.dumpID = k.[key]
)
union
(
SELECT p.*, k.rank
FROM WebTR.dbo.TempTable AS p
INNER JOIN containstable(WebTR.dbo.TempTable, body, '"*cunku*"') AS k
ON p.dumpID = k.[key]
))y group by dumpId,title,source,tags,creationdate,status,body,createdBy
order by rank DESC
END
正如你所看到的那样,当我 select 仅 select 查询它 returns 数据时,如果阻塞,但是当执行存储过程时,它 returns 为空,即使它进入如果块
这是他完整的 sp:
USE [WebTR]
GO
/****** Object: StoredProcedure [dbo].[search] Script Date: 10.6.2015 16:19:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[search]
@param1 varchar(250)
AS
BEGIN
declare @searchString varchar(250)
set @searchString = LTrim(RTrim(@param1))
TRUNCATE TABLE [WebTR].[dbo].[TempTable]
--SELECT ROW_NUMBER() OVER(ORDER BY @param1 ASC) AS row , * INTO #temp1 from WebTR.dbo.fnsplitstring(@searchString ,'')
SELECT ROW_NUMBER() OVER(ORDER BY CAST(SUBSTRING(splitdata, 0, 2) AS CHAR(1)) desc) AS row,* INTO #params from WebTR.dbo.fnsplitstring(@searchString ,'')
SET NOCOUNT ON
DECLARE @row INT
DECLARE @splitdata VARCHAR(50)
DECLARE @replaced1 VARCHAR(500)
DECLARE @replaced2 VARCHAR(500)
DECLARE @replacedLast VARCHAR(500)
DECLARE @last VARCHAR(500)
DECLARE TableA_cursor CURSOR FOR SELECT row FROM #params
SET @last = (SELECT COUNT(*) FROM #params)
SET @replacedLast = ''
OPEN TableA_cursor
FETCH NEXT FROM TableA_cursor INTO @row
WHILE @@FETCH_STATUS = 0
BEGIN
SET @splitdata = (SELECT splitdata FROM #params WHERE row=@row)
IF LEFT(@splitdata,1) = '#'
BEGIN
SET @splitdata = (SELECT REPLACE(@splitdata,'#',''))
BEGIN TRANSACTION
INSERT INTO [WebTR].[dbo].[TempTable]
SELECT p.*
FROM [WebTR].[dbo].[Dump] AS p
INNER JOIN containstable([WebTR].[dbo].[Dump], tags, @splitdata) AS k
ON p.dumpID = k.[key]
COMMIT TRANSACTION
end
ELSE
begin
IF LEFT(@splitdata,1)='-'
BEGIN
IF RIGHT(@replacedLast,4) = 'AND '
BEGIN
SET @replaced1 =('NOT ')
END
ELSE
BEGIN
SET
@replaced1 =('NOT ')
end
SET @replaced2= @replaced1 + (SELECT REPLACE (@splitdata, '-', '"*'))
SET @replaced2= @replaced2 + '*" ' + 'AND '
END
ELSE
BEGIN
SET @replaced2 =('"*')
SET @replaced2 = @replaced2 + (SELECT @splitdata + '*" AND ')
END
SET @replacedLast += @replaced2
END
FETCH NEXT FROM TableA_cursor INTO @row
IF @@FETCH_STATUS !=0
BEGIN
IF RIGHT(@replacedLast,4)='AND '
BEGIN
SET @replacedLast =LEFT(@replacedLast,(LEN(@replacedLast)-3))
END
END
END
CLOSE TableA_cursor
DEALLOCATE TableA_cursor
IF EXISTS(SELECT * FROM WebTR.dbo.TempTable)
BEGIN
SELECT @replacedLast AS withtag
select dumpId,title,source,tags,creationdate,status,body,createdBy,max(rank) as rank,'olsanaaa' AS sinir
from
((SELECT p.*, k.rank
FROM WebTR.dbo.TempTable AS p
INNER JOIN containstable(WebTR.dbo.TempTable, title,'"*cunku*"' ) AS k
ON p.dumpID = k.[key]
)
union
(
SELECT p.*, k.rank
FROM WebTR.dbo.TempTable AS p
INNER JOIN containstable(WebTR.dbo.TempTable, body, '"*cunku*"') AS k
ON p.dumpID = k.[key]
))y group by dumpId,title,source,tags,creationdate,status,body,createdBy
order by rank DESC
END
ELSE
BEGIN
select * into #temp1
from
((SELECT p.*, k.rank
FROM [WebTR].[dbo].[Dump] AS p
INNER JOIN containstable([WebTR].[dbo].[Dump], title, @replacedLast) AS k
ON p.dumpID = k.[key]
)
union
(
SELECT p.*, k.rank
FROM [WebTR].[dbo].[Dump] AS p
INNER JOIN containstable([WebTR].[dbo].[Dump], body, @replacedLast) AS k
ON p.dumpID = k.[key]
))x
select dumpId,title,source,tags,creationdate,status,body,createdBy,max(rank) as rank
from #temp1 with (NOLOCK)
group by dumpId,title,source,tags,creationdate,status,body,createdBy
order by rank DESC
DROP TABLE #temp1
end
END
我在 SQL Server 2008 中也有这种不当行为。如果您使用全文索引插入和检索速度太快,您的查询将不会生成新查询。
也许您需要手动填充全文索引。
查看基于 AdventureWorks 的示例
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate START UPDATE POPULATION;
GO
https://technet.microsoft.com/en-us/library/ms142575.aspx
希望人口更新能解决您的问题。
此致,
离子
CLOSE TableA_cursor
DEALLOCATE TableA_cursor
这部分你检查了吗?因为您的光标在某些操作之前正在关闭。
我有一个写入 Table 并读取 table 的存储过程。我写没有问题,但是当我想阅读它时 returns 是空的。但是当我 select 查询并且 运行 它 returns 数据时它不是空的。为什么可以。 这是我的代码。我将全文索引 Dump 和 TempTable 赋给标签、标题和 body 列。
IF LEFT(@splitdata,1) = '#'
BEGIN
SET @splitdata = (SELECT REPLACE(@splitdata,'#',''))
INSERT INTO [WebTR].[dbo].[TempTable]
SELECT p.*
FROM [WebTR].[dbo].[Dump] AS p
INNER JOIN containstable([WebTR].[dbo].[Dump], tags, @splitdata) AS k
ON p.dumpID = k.[key]
end
SET @replacedLast += @replaced2
FETCH NEXT FROM TableA_cursor INTO @row
我先插入温度table然后
IF EXISTS(SELECT * FROM WebTR.dbo.TempTable)
BEGIN
SELECT @replacedLast AS withtag
select dumpId,title,source,tags,creationdate,status,body,createdBy,max(rank) as rank,'olsanaaa' AS sinir
from
((SELECT p.*, k.rank
FROM WebTR.dbo.TempTable AS p
INNER JOIN containstable(WebTR.dbo.TempTable, title,'"*cunku*"' ) AS k
ON p.dumpID = k.[key]
)
union
(
SELECT p.*, k.rank
FROM WebTR.dbo.TempTable AS p
INNER JOIN containstable(WebTR.dbo.TempTable, body, '"*cunku*"') AS k
ON p.dumpID = k.[key]
))y group by dumpId,title,source,tags,creationdate,status,body,createdBy
order by rank DESC
END
正如你所看到的那样,当我 select 仅 select 查询它 returns 数据时,如果阻塞,但是当执行存储过程时,它 returns 为空,即使它进入如果块
这是他完整的 sp:
USE [WebTR]
GO
/****** Object: StoredProcedure [dbo].[search] Script Date: 10.6.2015 16:19:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[search]
@param1 varchar(250)
AS
BEGIN
declare @searchString varchar(250)
set @searchString = LTrim(RTrim(@param1))
TRUNCATE TABLE [WebTR].[dbo].[TempTable]
--SELECT ROW_NUMBER() OVER(ORDER BY @param1 ASC) AS row , * INTO #temp1 from WebTR.dbo.fnsplitstring(@searchString ,'')
SELECT ROW_NUMBER() OVER(ORDER BY CAST(SUBSTRING(splitdata, 0, 2) AS CHAR(1)) desc) AS row,* INTO #params from WebTR.dbo.fnsplitstring(@searchString ,'')
SET NOCOUNT ON
DECLARE @row INT
DECLARE @splitdata VARCHAR(50)
DECLARE @replaced1 VARCHAR(500)
DECLARE @replaced2 VARCHAR(500)
DECLARE @replacedLast VARCHAR(500)
DECLARE @last VARCHAR(500)
DECLARE TableA_cursor CURSOR FOR SELECT row FROM #params
SET @last = (SELECT COUNT(*) FROM #params)
SET @replacedLast = ''
OPEN TableA_cursor
FETCH NEXT FROM TableA_cursor INTO @row
WHILE @@FETCH_STATUS = 0
BEGIN
SET @splitdata = (SELECT splitdata FROM #params WHERE row=@row)
IF LEFT(@splitdata,1) = '#'
BEGIN
SET @splitdata = (SELECT REPLACE(@splitdata,'#',''))
BEGIN TRANSACTION
INSERT INTO [WebTR].[dbo].[TempTable]
SELECT p.*
FROM [WebTR].[dbo].[Dump] AS p
INNER JOIN containstable([WebTR].[dbo].[Dump], tags, @splitdata) AS k
ON p.dumpID = k.[key]
COMMIT TRANSACTION
end
ELSE
begin
IF LEFT(@splitdata,1)='-'
BEGIN
IF RIGHT(@replacedLast,4) = 'AND '
BEGIN
SET @replaced1 =('NOT ')
END
ELSE
BEGIN
SET
@replaced1 =('NOT ')
end
SET @replaced2= @replaced1 + (SELECT REPLACE (@splitdata, '-', '"*'))
SET @replaced2= @replaced2 + '*" ' + 'AND '
END
ELSE
BEGIN
SET @replaced2 =('"*')
SET @replaced2 = @replaced2 + (SELECT @splitdata + '*" AND ')
END
SET @replacedLast += @replaced2
END
FETCH NEXT FROM TableA_cursor INTO @row
IF @@FETCH_STATUS !=0
BEGIN
IF RIGHT(@replacedLast,4)='AND '
BEGIN
SET @replacedLast =LEFT(@replacedLast,(LEN(@replacedLast)-3))
END
END
END
CLOSE TableA_cursor
DEALLOCATE TableA_cursor
IF EXISTS(SELECT * FROM WebTR.dbo.TempTable)
BEGIN
SELECT @replacedLast AS withtag
select dumpId,title,source,tags,creationdate,status,body,createdBy,max(rank) as rank,'olsanaaa' AS sinir
from
((SELECT p.*, k.rank
FROM WebTR.dbo.TempTable AS p
INNER JOIN containstable(WebTR.dbo.TempTable, title,'"*cunku*"' ) AS k
ON p.dumpID = k.[key]
)
union
(
SELECT p.*, k.rank
FROM WebTR.dbo.TempTable AS p
INNER JOIN containstable(WebTR.dbo.TempTable, body, '"*cunku*"') AS k
ON p.dumpID = k.[key]
))y group by dumpId,title,source,tags,creationdate,status,body,createdBy
order by rank DESC
END
ELSE
BEGIN
select * into #temp1
from
((SELECT p.*, k.rank
FROM [WebTR].[dbo].[Dump] AS p
INNER JOIN containstable([WebTR].[dbo].[Dump], title, @replacedLast) AS k
ON p.dumpID = k.[key]
)
union
(
SELECT p.*, k.rank
FROM [WebTR].[dbo].[Dump] AS p
INNER JOIN containstable([WebTR].[dbo].[Dump], body, @replacedLast) AS k
ON p.dumpID = k.[key]
))x
select dumpId,title,source,tags,creationdate,status,body,createdBy,max(rank) as rank
from #temp1 with (NOLOCK)
group by dumpId,title,source,tags,creationdate,status,body,createdBy
order by rank DESC
DROP TABLE #temp1
end
END
我在 SQL Server 2008 中也有这种不当行为。如果您使用全文索引插入和检索速度太快,您的查询将不会生成新查询。
也许您需要手动填充全文索引。
查看基于 AdventureWorks 的示例
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate START UPDATE POPULATION;
GO
https://technet.microsoft.com/en-us/library/ms142575.aspx
希望人口更新能解决您的问题。
此致, 离子
CLOSE TableA_cursor
DEALLOCATE TableA_cursor
这部分你检查了吗?因为您的光标在某些操作之前正在关闭。