无效列名'在SQL Server中

本文关键字:SQL Server 无效 | 更新日期: 2023-09-27 18:15:27

alter procedure NewUserTableCreation(@Username varchar(50))
as
    declare @CreateUserTable NVARCHAR(MAX)
    declare @AddRecord NVARCHAR(MAX)
    declare @VisitedClothesKids varchar(50)='VisitedClothesKids'
    declare @InitialCount varchar(20)='0'
BEGIN
    --Building query for creating a user table
    SET @CreateUserTable = 'create table ' + @Username +
                           '_Table(UserActivityData varchar(50),DataValue varchar(20))'
    EXEC(@CreateUserTable);
    --Adding Records in the user table
    SET @AddRecord = 'insert into ' + @Username + '_Table(UserActivityData, DataValue)
                      values(' + @VisitedClothesKids + ','  + @InitialCount + ')'
    EXEC(@AddRecord);
END
GO

我从c#代码执行这个过程。表被成功创建,然后抛出一个异常:

列名'VisitedClothesKids'无效
无效的列名"InitialCount"

请帮忙!非常感谢:)

无效列名'在SQL Server中

问题是正在连接的字符串本身没有将值放在引号中:

values('+@VisitedClothesKids+','+@InitialCount+')'

values(VisitedClothesKids,0)'

当你想要

values('VisitedClothesKids','0')'

我们还应该警告你,你在这里使用的技术是开放的SQL注入,应该避免。

要解决这类问题,必须检查正在执行的语句。例如,如果您这样做(传入"MyData"作为表名):

PRINT @AddRecord;
EXEC(@AddRecord);

您将看到如下输出:

insert into MyData_Table(UserActivityData,DataValue) values(VisitedClothesKids,0)'

失败,因为SQL不知道"VisitedClothesKids"是什么。您希望语句为

insert into MyData_Table(UserActivityData,DataValue) values('VisitedClothesKids',0)'

用引号指定字面值字符串。要得到这个,像这样修改你的"build "语句:

SET @AddRecord = 'insert into '+@Username+'_Table(UserActivityData,DataValue)
values('''+@VisitedClothesKids+''','+@InitialCount+')'

在这种情况下,SQL将解释(或"转义")两个单引号,''作为单引号,'