我正在从Person_Permissions表创建一个表(my)。我使用的存储过程有两个参数(@username Varchar(20),@ tableName Varchar(20))。
我有以下代码抛出错误:
多部分标识符" modise@gmail.com"无法受约束。
我的代码:
CREATE PROCEDURE [dbo].[myPermissions](@username VARCHAR(20), @tableName VARCHAR(20))
AS
DECLARE @sSQL VARCHAR(MAX)
SET @sSQL = 'SELECT * INTO my FROM [' + @tableName + '_Permissions] WHERE userName =' + @username
EXECUTE(@sSQL)
答案 0 :(得分:3)
这是一种比简单地使动态sql工作更好的方法。这可以参数化您的动态查询并防止sql注入。你仍然有一个问题,你正在创建一个名为"我的"每次都这样运行。
CREATE PROCEDURE [dbo].[myPermissions]
(
@username VARCHAR(20)
, @tableName VARCHAR(20)
) AS
DECLARE @sSQL NVARCHAR(MAX)
SET @sSQL = 'SELECT * INTO my FROM [' + QUOTENAME(@tableName) + '_Permissions] WHERE userName = @username'
exec sp_executesql @sSQL, N'@username varchar(20)', @username = @username
答案 1 :(得分:2)
更安全的方法是使用sp_executesql
。如下所示:
declare @actualTableName VARCHAR(100) = @tableName + '_Permissions'
declare @sSQL NVARCHAR(4000) = N'
SELECT * INTO my
FROM ' + QUOTENAME(@actualTableName) + '
WHERE userName = @username'
EXEC sp_executesql @sSQL, '@username VARCHAR(20)', @username = @username
这种混合方法是必需的,因为表名不能作为动态查询中的参数提供,但@username
可以(并且应该)。
答案 2 :(得分:1)
在结尾处缺少单'
SET @sSQL = 'SELECT * INTO my FROM [' + @tableName + '_Permissions] WHERE userName =''' + @username+'''