一般来说,我构建使用 sp_executsql 执行的动态 SQL 语句,如下所示:
EXEC sp_executesql @TempSQLStatement
Run Code Online (Sandbox Code Playgroud)
我需要将返回结果行集插入某些内容(表变量或临时表),但出现以下错误:
Msg 208, Level 16, State 0, Line 1746
Invalid object name '#TempTable'.
Run Code Online (Sandbox Code Playgroud)
执行此操作后:
INSERT INTO #TempTable
EXEC sp_executesql @TempSQLStatement
Run Code Online (Sandbox Code Playgroud)
根据我所读到的内容,我认为问题是由于我没有指定临时表的列而引起的,但我无法执行此操作,因为返回列数有所不同。
我读过我可以使用全局临时表,但我之前已经这样做过,想知道是否还有其他方法可以做到这一点。
我想在我的程序中进行动态查询.SQL Server有针对此类任务的简洁sp_executesql过程,MySQL中有什么可以帮助我实现类似的功能吗?
我需要delete所有rows的一些table where值是空字符串.(我有多个表有相似的名称).
我试着执行字符串中的那些sql语句:
DECLARE @sql AS NVARCHAR(MAX)
DECLARE @emptyValue AS NVARCHAR(1) =''
set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue+''
exec sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)
但这让我错了 Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '='.
我试着弄清楚大约一个小时了.任何帮助,将不胜感激.
编辑:
这是删除最后一个配额后得到的内容.@tableName是nvarchar(MAX).

DECLARE @sql NVARCHAR(max)
DECLARE @ParmDefinition NVARCHAR(500)
SET @sql = 'UPDATE [Table1] SET [Table1].[@columnName] = TEST';
SET @ParmDefinition = N'@columnName NVARCHAR(50)';
EXEC sp_executesql @sql, @ParmDefinition, @columnName = N'MyColumn';
Run Code Online (Sandbox Code Playgroud)
当我运行上述查询时,我得到Invalid column name '@columnName'.. 显然,在运行查询时不会替换列名。
实际上,我的@sql 变量要大得多,而且我有很多要更新的列,因此我想避免SET SQL =对列名的所有枚举进行操作。
我想声明一次 sql 字符串,并使用不同的值调用查询。例如:
EXEC sp_executesql @sql, @ParmDefinition, @columnName = N'MyColumn';
EXEC sp_executesql @sql, @ParmDefinition, @columnName = N'AnotherColumn';
EXEC sp_executesql @sql, @ParmDefinition, @columnName = N'YetAnotherColumn';
-- And so on
Run Code Online (Sandbox Code Playgroud)
这样的事情可能吗?
我正在使用SQL Server 2008 R2.我需要在下面的T-SQL的最后部分使用一个参数.
在这部分中,指定了sp_executesql的参数值,但我想动态提供它.
EXECUTE sp_executesql @sql,N'@startIndex1 int,@maxRows1 int',
@startIndex1 = @startIndex,@maxRows1 = @maxRows--LAST PART
Run Code Online (Sandbox Code Playgroud) 有没有什么方法可以调用sp_executesql参数不依赖于它们在商店中定义的顺序?与exec相同的查询效果很好,并且如果你有相同的顺序它也可以很好地工作,但是一个接一个地匹配参数是一件很痛苦的事情,因为有时候我会通过助手动态地生成调用,如果dto对象没有在相同的顺序中具有相同的字段,不能很好地工作.
create procedure ordertest
@PARAM1 INT,
@PARAM2 INT
AS
BEGIN
SELECT @PARAM1 AS ONE, @PARAM2 AS TWO
END
-- this works
EXEC ordertest @PARAM1 = 1, @PARAM2 = 2
exec sp_executesql N'exec ordertest @PARAM1, @PARAM2', N'@param1 int, @param2 int', @param2 = '2', @param1 = '1'
EXEC ordertest @PARAM2 = 2, @PARAM1 = 1
-- this doesn't work
exec sp_executesql N'exec ordertest @PARAM2, @PARAM1', N'@param1 int, @param2 int', @param2 = '2', @param1 = '1'
Run Code Online (Sandbox Code Playgroud) 给定一个简单的存储过程,它将填充一个OUTPUT参数以及RETURN一个sa值,例如:
CREATE PROCEDURE sp_test
(
@param_out INT OUTPUT
)
AS BEGIN
SELECT @param_out = 9
RETURN 2
END
Run Code Online (Sandbox Code Playgroud)
如何使用sp_executesql并捕获这两个值来调用此过程?
我试过了:
DECLARE @ret INT, @param_out INT
EXEC SP_EXECUTESQL N'EXEC @ret = sp_test',
N'@ret INT OUTPUT, @param_out INT OUTPUT',
@ret OUTPUT,
@param_out OUTPUT
SELECT @ret, @param_out
Run Code Online (Sandbox Code Playgroud)
但是,这抱怨@param_out没有提供:
过程或函数“ sp_test”需要未提供的参数“ @param_out”。
我想执行大约10,000个字符的动态SQL语句.
当我使用sp_executesql如下:
DECLARE @stmt varchar(MAX)
SET @stmt = 'xxxxxxxx.................' which is about 10,000 characters
EXEC sp_executesql @stmt
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
The character string that starts with ' select t1.e_reference xxxxxxxxxxx' is too long. Maximum length is 8000.
Run Code Online (Sandbox Code Playgroud)
据我所知,我们可以使用sp_executesql来执行很长的语句,不是吗?
我使用的是SQL Server 2008企业版,64位.
我怎样才能做到这一点?谢谢.
我正在尝试构建一个SQL字符串来执行,sp_executesql但我似乎无法为传入的sql字符串中的声明变量赋值.
以下是我的程序示例
ALTER PROCEDURE [dbo].[selectRecords]
@psID INT --parameter passed in
AS
DECLARE @existingRecordCount INT=0
DECLARE @sql NVARCHAR(1000)
DECLARE @paramDefinitions NVARCHAR(1000)
SET @paramDefinitions=
'@psID INT,
@existingRecordCount INT OUTPUT'
SET @sql='
SELECT
@existingRecordCount=COUNT(Name)
FROM dbo.Asset_Log
WHERE ID=@psID
GROUP BY Name'
EXECUTE sp_executesql @sql, @paramDefinitions, @psID, @existingRecordCount
Run Code Online (Sandbox Code Playgroud)
所以,我希望我的记录计数在@existingRecordCount变量中,但是我收到以下错误:
'OUPUT'附近的语法不正确.
必须声明标量变量"@existingRecordCount".
我究竟做错了什么?
提前致谢.我正在使用SQL Server 2008
我有以下内容doGet():
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
MysqlDataSource ds = new MysqlConnectionPoolDataSource();
ds.setServerName("localhost");
ds.setPort(3306);
ds.setUser("root");
ds.setPassword("");
try {
Connection connection = null ;
connection = ds.getConnection();
Statement statement = connection.createStatement();
// create the DB ..
statement.executeUpdate("CREATE DATABASE IF NOT EXISTS "
+"testSQLtable" ) ;
// use DB ..
statement.executeUpdate("USE testSQLtable") ;
// create table ...
statement.executeUpdate("DROP TABLE IF EXISTS account "
+"CREATE TABLE account ( "
+"accountNum INT( 11 ),"
+"dateCreated DATE NOT NULL," …Run Code Online (Sandbox Code Playgroud) sp-executesql ×10
sql-server ×6
t-sql ×4
sql ×3
mysql ×2
create-table ×1
dapper ×1
dynamic-sql ×1
java ×1
temp-tables ×1
variables ×1