无效列名'在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"
请帮忙!非常感谢:)
问题是正在连接的字符串本身没有将值放在引号中:
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将解释(或"转义")两个单引号,''
作为单引号,'
。