从另一个创建表

时间:2016-04-19 13:11:40

标签: sql-server

我正在从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)

3 个答案:

答案 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+'''