我有一个我正在处理的程序,我不知道出了什么问题。我已经审核了所有其他网站,但找不到我遇到的问题
我想创建一个具有动态where子句的过程,该子句基于发送到过程的位组合。我不想创建一堆类似的程序,因为它们的条件略有不同。
我将以下查询放入游标,然后循环遍历游标。请帮忙。
CREATE PROCEDURE [dbo].[procContainTest] (
@USE_A BIT,
@USE_B BIT,
@ValueA VARCHAR(50),
@ValueB VARCHAR(50),
@USERID VARCHAR(50)
)
AS
DECLARE @TEMP_Col1 INT,
@TEMP_Col2 INT,
@TEMP_Col3 VARCHAR(50),
@TEMP_Col4 VARCHAR(50),
@TEMP_Col5 VARCHAR(50),
@POINT_ONE NVARCHAR(50),
@POINT_TWO NVARCHAR(50)
SET @TRIGGER = 0
WHILE @TRIGGER = 0
BEGIN
-- F2 Booking Term
IF @USE_A = 1
AND @USE_B = 1
BEGIN
SET @POINT_ONE = 'ColName2'
SET @POINT_TWO = 'ColName3'
END
-- F6 Booking Term
IF @USE_A = 0
AND @USE_B = 1
BEGIN
SET @POINT_ONE = 'ColName1'
SET @POINT_TWO = 'ColName2'
END
DECLARE INNER_CURSOR CURSOR
FOR
SELECT TOP 1 TEMP_Col1 INT,
TEMP_Col2,
TEMP_Col3,
@TEMP_Col4,
@TEMP_Col5
FROM TEMP_Table
WHERE @POINT_ONE = + '''' + @ValueA + ''''
AND @POINT_TWO = + '''' + @ValueB + ''''
AND USERID = @USERID
ORDER BY LENGTH
答案 0 :(得分:3)
升 您可以将Select语句放在如下变量中:
declare @YourSelectStatement nvarchar(max)
set @YourSelectStatement = ' SELECT TOP 1 TEMP_Col1 INT,
TEMP_Col2,
TEMP_Col3,
FROM TEMP_Table
WHERE ' + @POINT_ONE + '=' + @ValueA + '
AND ' + @POINT_TWO + '=' + @ValueB + '
AND USERID = ' + @USERID + '
ORDER BY LENGTH'
sp_executesql(@YourSelectStatement)
答案 1 :(得分:2)
我会完全避免使用动态SQL。您可以消除IF语句并在SELECT语句中嵌入相同的logid,如下所示:
SELECT TOP 1
TEMP_Col1,
TEMP_Col2,
TEMP_Col3,
TEMP_Col4,
TEMP_Col5
FROM TEMP_Table
WHERE (@USE_A = 1 AND @USE_B = 1 AND ColName2 = '''' + @ValueA + '''' AND ColName3 = '''' + @ValueB + '''')
OR (@USE_A = 0 AND @USE_B = 1 AND ColName1 = '''' + @ValueA + '''' AND ColName2 = '''' + @ValueB + '''')
答案 2 :(得分:2)
这可能对你有帮助:
IndexOutOfBoundsException