相关疑难解决方法(0)

动态SQL - EXEC(@SQL)与EXEC SP_EXECUTESQL(@SQL)

在SQL Server中使用存储过程执行动态SQL命令的真实优点和缺点是什么?

EXEC (@SQL)
Run Code Online (Sandbox Code Playgroud)

EXEC SP_EXECUTESQL @SQL
Run Code Online (Sandbox Code Playgroud)

sql sql-server dynamic

90
推荐指数
3
解决办法
20万
查看次数

如何将表名作为存储过程的输入参数?

我下面有一个小的存储过程.

我将表名作为存储过程的输入参数,以便我计划将数据插入临时表并显示相同的内容.这只是我项目存储过程的一个很小的代码块.

当我编译下面的内容时,它会将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)

sql-server stored-procedures table-variable

10
推荐指数
2
解决办法
4万
查看次数

存储过程,其中包含表名作为参数

我试图更新一个工作正常的存储过程,而无需使用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)

sql-server stored-procedures dynamic-sql

7
推荐指数
1
解决办法
1万
查看次数

在sql存储过程中传递表名

是否可以将表名作为输入参数传递给存储过程?

例如:

create procedure test
@tablename char(10)
as
begin
select * from @tablename
end
go
Run Code Online (Sandbox Code Playgroud)

我知道这不起作用.那么,如果我想将表名传递给存储过程,最好的方法是什么?

非常感谢

t-sql stored-procedures

5
推荐指数
1
解决办法
2万
查看次数

使用 SqlBuilder 在 FROM 子句中注入 SQL

我们有一个 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 注入攻击的示例,我将不胜感激,以便我可以了解它的工作原理并创建测试。

c# sql sql-server sql-injection

5
推荐指数
1
解决办法
993
查看次数

使用动态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)

sql sql-server sql-server-2008

3
推荐指数
1
解决办法
1万
查看次数

如何在存储过程中将表声明为参数

存储过程抛出错误

必须声明一个表变量

在存储过程中,我从调用该存储过程的 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)

sql sql-server stored-procedures

3
推荐指数
1
解决办法
1万
查看次数

C#Alter Table并以编程方式添加一列ASP.Net和SQL Server

我一直在尝试在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应该改变表并添加新列.

c# sql-server asp.net

2
推荐指数
1
解决办法
8898
查看次数