Sql server 列名“Results”无效
抛出错误: 列名“Results”无效Sql server 列名“Results”无效,sql-server,Sql Server,抛出错误: 列名“Results”无效 如何解决它?如果我正确理解您的问题,您应该先执行动态sql,然后再从临时表中选择 alter PROCEDURE sp_Get_CustInfoSerach2 (@PageIndex INT = 1 ,@PageSize INT = 10 ,@RecordCount INT OUTPUT ,@ColumnName VARCHAR(50)=null ,@Value VARCHAR(50)=n
如何解决它?如果我正确理解您的问题,您应该先执行动态sql,然后再从临时表中选择
alter PROCEDURE sp_Get_CustInfoSerach2
(@PageIndex INT = 1
,@PageSize INT = 10
,@RecordCount INT OUTPUT
,@ColumnName VARCHAR(50)=null
,@Value VARCHAR(50)=null
,@ddlValue VARCHAR(50)=null
,@txtValue VARCHAR(50)=null
,@status varchar(30))
AS
BEGIN
SET NOCOUNT ON;
DECLARE @cmd AS NVARCHAR(max)
if @txtValue IS NULL
Begin
SET @Value = ''''+@ddlValue+ ''''
End
else if @ddlValue IS NULL
begin
SET @Value = ''''+@txtValue+ ''''
end
SET @cmd = 'SELECT ROW_NUMBER() OVER
(
ORDER BY C_Register.UserId desc
)AS RowNumber
,C_Register.UserId, C_Register.Name, C_Register.UserName, C_Register.Status,
Packages.PackagePeriod, Packages.PackageName, C_Register.ActivationDate,
Receive_Payment.OldExpiryDate, Receive_Payment.Balance, Receive_Payment.PyingAmount,
Receive_Payment.LastPaidDate, C_Register.LastUpdateTime,
Area.AreaName, C_Register.MobNo, Employee.EmpName, C_Register.Address,C_Register.CreatedDate
INTO'+ #Results+'
FROM C_Register INNER JOIN Receive_Payment ON C_Register.UserId = Receive_Payment.UserId
INNER JOIN Area ON C_Register.AreaId = Area.AreaId
INNER JOIN Employee ON Receive_Payment.EmpId = Employee.EmpId
INNER JOIN Packages ON Receive_Payment.PackageId = Packages.PackageId
where C_Register.AccountExpiry= Receive_Payment.OldExpiryDate And C_Register.Status = '+@status+'And
' + @ColumnName + ' = ' + @Value
SELECT @RecordCount = COUNT(*)
FROM #Results
SELECT * FROM #Results
WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
DROP TABLE #Results
EXEC(@cmd)
END
查询中的问题是临时表的创建,这不是在动态查询中创建临时表的正确方法 但即使在动态查询中创建临时表,也只能在动态查询会话中访问它。如果您尝试选择动态查询外部的临时值,该临时值是在动态查询内部创建的,您将得到一个错误,说明对象不存在 因为您知道动态查询结果中的列数,所以可以在动态查询之外创建临时表,并通过动态查询插入记录 试着像这样改变你的程序
Alter PROCEDURE sp_Get_CustInfoSerach2
(
@PageIndex INT = 1 ,
@PageSize INT = 10 ,
@RecordCount INT OUTPUT ,
@ColumnName VARCHAR(50)=null ,
@Value VARCHAR(50)=null ,
@ddlValue VARCHAR(50)=null ,
@txtValue VARCHAR(50)=null ,
@status varchar(30)
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @cmd AS NVARCHAR(max)
If @txtValue IS NULL
Begin
SET @Value = ''''+@ddlValue+ ''''
End
Else
if @ddlValue IS NULL
Begin
SET @Value = ''''+@txtValue+ ''''
End
SET @cmd = 'SELECT ROW_NUMBER() OVER ( ORDER BY C_Register.UserId desc )AS RowNumber,
C_Register.UserId, C_Register.Name, C_Register.UserName, C_Register.Status,
Packages.PackagePeriod, Packages.PackageName, C_Register.ActivationDate,
Receive_Payment.OldExpiryDate, Receive_Payment.Balance, Receive_Payment.PyingAmount,
Receive_Payment.LastPaidDate, C_Register.LastUpdateTime,
Area.AreaName, C_Register.MobNo, Employee.EmpName, C_Register.Address,C_Register.CreatedDate
INTO #Results
FROM C_Register INNER JOIN Receive_Payment ON C_Register.UserId = Receive_Payment.UserId
INNER JOIN Area ON C_Register.AreaId = Area.AreaId
INNER JOIN Employee ON Receive_Payment.EmpId = Employee.EmpId
INNER JOIN Packages ON Receive_Payment.PackageId = Packages.PackageId
where C_Register.AccountExpiry= Receive_Payment.OldExpiryDate And C_Register.Status = '+@status+'And
' + @ColumnName + ' = ' + @Value
/*First Execute above dynamic Sql query */
EXEC(@cmd)
/* From the above execute statemnet the query will executed and temporary table will created on the fly */
SELECT @RecordCount = COUNT(*)
FROM #Results
SELECT * FROM #Results
WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
DROP TABLE #Results
注意:我为临时表列提供了通用数据类型。请根据您的架构更改日期类型。我认为您没有将结果变量声明到storedprocedureHow关于不构建SQL-改用参数如何?注意,您的问题与C、paging或GridViews无关。在此查询之前,我创建了相同的查询,但没有引号,所以它正在执行,但在这里,我为pass参数添加了引号,因为coloumnI试图执行相同的ur提到的qury,但再次抛出结果未知错误。因此,我更改如下
ALTER PROCEDURE Sp_get_custinfoserach2 (@PageIndex INT = 1,
@PageSize INT = 10,
@RecordCount INT output,
@ColumnName VARCHAR(50)=NULL,
@Value VARCHAR(50)=NULL,
@ddlValue VARCHAR(50)=NULL,
@txtValue VARCHAR(50)=NULL,
@status VARCHAR(30))
AS
BEGIN
SET nocount ON;
DECLARE @cmd AS NVARCHAR(max)
IF @txtValue IS NULL
BEGIN
SET @Value = '''' + @ddlValue + ''''
END
ELSE IF @ddlValue IS NULL
BEGIN
SET @Value = '''' + @txtValue + ''''
END
/*create a temp as same structure of your dynamic query select statement*/
CREATE TABLE #result
(
rownum INT,
userid INT,
NAME VARCHAR(100),
username VARCHAR(100),
status VARCHAR(15),
packageperiod VARCHAR(15),
packagename VARCHAR(100),
activationdate DATETIME,
oldexpirydate DATETIME,
balance NUMERIC(22, 4),
pyingamount NUMERIC(22, 4),
lastpaiddate DATETIME,
lastupdatetime DATETIME,
areaname VARCHAR(100),
mobno INT,
empname VARCHAR(100),
address VARCHAR(5000),
createddate DATETIME
)
SET @cmd =
' Insert into #result
SELECT ROW_NUMBER() OVER (ORDER BY C_Register.UserId desc )AS RowNumber,
C_Register.UserId, C_Register.Name, C_Register.UserName,
C_Register.Status, Packages.PackagePeriod, Packages.PackageName,
C_Register.ActivationDate,Receive_Payment.OldExpiryDate,
Receive_Payment.Balance, Receive_Payment.PyingAmount,
Receive_Payment.LastPaidDate, C_Register.LastUpdateTime,
Area.AreaName, C_Register.MobNo, Employee.EmpName,
C_Register.Address,C_Register.CreatedDate
FROM C_Register
INNER JOIN Receive_Payment
ON C_Register.UserId = Receive_Payment.UserId
INNER JOIN Area
ON C_Register.AreaId = Area.AreaId
INNER JOIN Employee
ON Receive_Payment.EmpId = Employee.EmpId
INNER JOIN Packages
ON Receive_Payment.PackageId = Packages.PackageId
where C_Register.AccountExpiry= Receive_Payment.OldExpiryDate And C_Register.Status = ' + @status + ' And ' + @ColumnName + ' = ' + @Value
SELECT @RecordCount = Count(*)
FROM #results
SELECT *
FROM #results
WHERE rownumber BETWEEN( @PageIndex - 1 ) * @PageSize + 1 AND( (
( @PageIndex - 1 ) * @PageSize + 1 ) +
@PageSize ) - 1
DROP TABLE #results
EXEC(@cmd)
END