在SQL Server中使用存储过程执行动态SQL命令的真实优点和缺点是什么?
EXEC (@SQL)
Run Code Online (Sandbox Code Playgroud)
与
EXEC SP_EXECUTESQL @SQL
Run Code Online (Sandbox Code Playgroud)
?
我下面有一个小的存储过程.
我将表名作为存储过程的输入参数,以便我计划将数据插入临时表并显示相同的内容.这只是我项目存储过程的一个很小的代码块.
当我编译下面的内容时,它会将select语句中的参数视为表变量并将错误抛出为:
必须声明表变量"@TableName".
SQL:
CREATE PROCEDURE xyz @TableName Varchar(50)
AS
BEGIN
SELECT TOP 10 * INTO #Temp_Table_One
FROM @TableName
SELECT * FROM #Temp_Table_One
END
Run Code Online (Sandbox Code Playgroud) 我试图更新一个工作正常的存储过程,而无需使用sp_executesql.我现在想要将表名作为参数,因为我有许多具有相同结构的表,并且不希望为每个表创建新的存储过程.
我遇到的问题是这个版本似乎需要所有参数,而前一个版本接受任意数量的参数.例如,如果我删除所有WHERE参数并且只有@TableName参数,它可以正常工作.我试过寻找一个例子,但我找不到这样的东西.解析表名的所有示例都只包含该参数.
CREATE PROCEDURE cafgTenantNamesTEST2
@TableName sysname,
@Square nvarchar(100) = null,
@Location nvarchar(100) = null,
@Name nvarchar(100) = null,
@NormalizedName nvarchar(100) = null,
@SharedLand int = 0,
@FieldNumber int = 0,
@Description nvarchar(255) = null,
@Dwelling nvarchar(100) = null
AS
BEGIN
DECLARE @sql AS NVARCHAR(MAX)
SET @sql = 'SELECT * FROM [' + @TableName + ']' +
'WHERE ([Square] LIKE ''' + @Square + ''' OR ''' + @Square + ''' IS NULL)' +
'AND ([Location] = ''' + @Location …Run Code Online (Sandbox Code Playgroud) 是否可以将表名作为输入参数传递给存储过程?
例如:
create procedure test
@tablename char(10)
as
begin
select * from @tablename
end
go
Run Code Online (Sandbox Code Playgroud)
我知道这不起作用.那么,如果我想将表名传递给存储过程,最好的方法是什么?
非常感谢
我们有一个 SQL 语句,它SqlBuilder在 from 子句中使用set the table name。数据库是 SQL Server 2008 及更高版本。
var sqlBuilder = new SqlBuilder();
sqlBuilder.Select("*").From(tableName);
sqlBuilder.Where("...");
Connection.BuilderQuery<dynamic>(sqlBulder).Select(Map);
Run Code Online (Sandbox Code Playgroud)
我想知道这是否是 SQL 注入风险?我怎样才能减轻这种风险?还是SqlBuilder管这些东西?
我可以通过将表名括在方括号中来降低风险吗?例如
sqlBuilder.From("[" + tableName + "]");
Run Code Online (Sandbox Code Playgroud)
此外,如果有人可以在FROM子句中提供一些 SQL 注入攻击的示例,我将不胜感激,以便我可以了解它的工作原理并创建测试。
我想在存储过程中使用动态SQL来创建表.
这是对存储过程的调用:
EXEC [spCreateAColDiffTable] 'hq193.dbo.arch_con_col_s193_s202'
Run Code Online (Sandbox Code Playgroud)
以下是存储过程的相关部分:
CREATE PROCEDURE sp_createAColDiffTable (@table_name nvarchar(128))
Run Code Online (Sandbox Code Playgroud)
...
SET @sSQL = 'CREATE TABLE ' + @table_name + ' ( ' +
' [table_name] VARCHAR (128) NOT NULL, ' +
' [column_name] VARCHAR (128) NULL, ' +
' [what_changed] VARCHAR (128) NULL, ' +
' [sr_data_type] VARCHAR (128) NOT NULL, ' +
' [tr_data_type] VARCHAR (128) NOT NULL, ' +
' [sr_max_length] SMALLINT NOT NULL, ' +
' [tr_max_length] SMALLINT NOT NULL, ' +
' [sr_is_nullable] CHAR …Run Code Online (Sandbox Code Playgroud) 存储过程抛出错误
必须声明一个表变量
在存储过程中,我从调用该存储过程的 UI 中获取表名称。我不想在存储过程中创建表变量。如果有人有想法,我们将不胜感激。谢谢。
存储过程如下:
ALTER PROCEDURE [dbo].[usp_Rates_GET_CustomOFCLData]
@returnOrigin VARCHAR(256),
@returnDest VARCHAR(256)
AS
BEGIN
SET NOCOUNT ON;
SELECT
*,
'o' as LocationType
FROM
@returnOrigin
UNION ALL
SELECT
*,
'd' as LocationType
FROM
@returnDest
END
Run Code Online (Sandbox Code Playgroud) 我一直在尝试在ASP.NET中以编程方式添加列来修改SQL Server中的表.
请参阅以下代码:
string suppliernotxt = supplieridlist[1].ToString();
//SqlCommand cmd2 = new SqlCommand("ALTER TABLE [ProductNormalDB] ADD suppliernotxt nvarchar(20) NULL", con);
SqlCommand cmd2 = new SqlCommand("ALTER TABLE ProductNormalDB ADD @supplierlist nvarchar(20) NULL", con);
cmd2.Parameters.AddWithValue("@supplierlist", suppliernotxt);
//cmd2.Parameters.AddWithValue("@supplierlist", suppliernotxt.ToString());
//cmd2.Parameters["@supplierlist"].Value = supplieridlist[x];
cmd2.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
supplieridlist是一个数组,它获取要添加到SQL Server数据库中的所有列名.由于某种原因,参数化方法不起作用并显示以下错误:
'@supplierlist'附近的语法不正确.
基本思路是让用户从复选框中选择供应商的名称,根据所选的供应商数量,阵列将为ex创建供应商名称.如果我们选择了3个供应商,该阵列将节省"Supplier1","Supplier2","Supplier3"然后SqlCommand应该改变表并添加新列.